0

ですから、私は一般的にC ++およびC言語にかなり慣れており、現在、数日でほぼ完了する予定のプロジェクトがあります。しかし、時々いくつかの問題が発生します。現在、コンストラクターを介したクラスデータメンバーの適切な割り当てに問題があります。

これが私が作成しようとしている問題のあるクラスのコードです:

#include <iostream>
#include <string>

class Set{

private:

int *setOfElements;
int noOfElements;

public:
Set::Set(int *setArray){
    setOfElements = setArray;
    noOfElements = setArray->length();
}

int *getSetOfElements(){ return setOfElements; }
int getNoOfElements(){ return noOfElements; }

int findMedian();
int findMean();

};

エラーはコンストラクター本体の2行目に表示されます。
int配列をパラメーターとして渡す場合、そのパラメーターの長さを参照する場合は、の代わりに->を使用する必要はありません。指示対象はポインタオブジェクトであり、従来の意味でのオブジェクトではないからですか?

ちなみに、VS 2010のエラーには、「Error:Expressionにはクラス型へのポインターが必要です」と書かれています。

ありがとう!

4

2 に答える 2

2

intlength()はクラスではなく、絶対に要素を持っていません。あなたは「別の言語をコピーしてC++に貼り付けようとしている」という邪悪な力によって堕落しています。唯一の治療法は「LearnC++」です。

なぜあなたはあなた自身のセットを書くのですか?言語にはが付属していstd::setます。

于 2012-11-10T18:48:27.980 に答える
1
  1. ここでの主な質問ではありませんが、DeadMG の回答に関するコメントの質問に答えるには: 一般に、配列の長さと C のポインターを渡す必要があります (C++ で C スタイルを使用する場合)。必要に応じて長さを検出できるため、ヌル終了文字列は例外です。

  2. std::set独自のクラスを作成する代わりに、標準ライブラリから使用することを提案するという点で、DeadMG に同意します。と の動作を取得するには、標準ライブラリの他のいくつかのビットも使用する必要がありfindMedianますfindMean

    #include <イテレータ>
    #include <数値>

    std::set<int> s;
    // 初期化します...
    int mean = std::accumulate(s.begin(), s.end(), 0);
    意味/= s.size(); // 本当に double を使用しますか?

    // std::set は順序付けられているため、中央値を見つけることはちょうど真ん中まで繰り返されます。
    int 中央値;
    std::set<int>::iterator i = s.begin();
    std::advance(i, s.size() / 2);
    if (s.size() % 2 == 1) {
      中央値 = *i;
    } そうしないと {
      中央値 = (*i + *(++i)) / 2;
    }
于 2012-11-10T19:13:15.827 に答える