0

ポリモーフィズムに問題があります。これらの基本クラスを設定しました。メソッドは後で追加されますが、これらのクラスからさまざまなデータメンバーにアクセスできるようにします。

class square
{
public:
    bool canBeBought;
    string name;
};

class property : public square
{ 
public:
    int rent;
    int colour;
    int cost;
    bool bought;
};

class specialSquare : public square
{
private:

public:
};

これが私が呼んでいるコードです

square* properties[23];
for(int i = 0; i < 23; i++)    
{
    if(propertyStrings.at(i).substr(0,8) == "Property")
    {
        istringstream ss(propertyStrings.at(i).substr(11,21));
        string temp;
        properties[i] = new property;
        while(!ss.eof())
        {
            properties[i]->bought = false;
            properties[i]->name = propertyStrings.at(i).substr(0,11);
            cout << "Name: " << properties[i]->name << endl;
            ss >> temp;
            properties[i]->cost = atoi(temp.c_str());
            cout << "Cost: "<< properties[i]->cost << endl;
            ss >> temp;
            properties[i]->rent = atoi(temp.c_str());
            cout << "Rent: "<< properties[i]->rent << endl;
            ss >> temp;
            properties[i]->colour = atoi(temp.c_str());
            cout << "Colour: "<< properties[i]->colour << endl << endl;

            break;
        }
    }
}

私の問題は、name変数がsquareクラスにあるため、正常に機能しますが、プロパティクラスのデータメンバーが認識されないことです。私の目的は、プロパティクラスとspecialSquareクラスの1つの配列にすべての正方形のデータを格納することでした。これにより、プログラムの後半で作業が簡単になります。

4

3 に答える 3

1

あなたの問題は、あなたがそれらをSquareへのポインタとして保存したので、コンパイラがあなたの「プロパティ」ポインタをクラスPropertyのインスタンスを指しているものとして認識しないことだと思います。property [i]をクラスProperty(((property*)properties[i])->colour)へのポインターにキャストすると、うまくいくはずです(これは実際にはそのクラスであり、別のクラスにはなれないことをコンパイラーに明示的に伝えています)。

ただし、PropertyとSpecial_Squareが実際にはSquaresでない場合、ポリモーフィズムはここでは間違った選択である可能性があります。タスクを実行する方法は他にもあります。たとえば、バリアントの配列などです。

于 2013-01-08T14:31:01.473 に答える
0

派生型の配列だけを持っていないのはなぜですか?配列には複数のタイプのSquareを含める必要がありますか?含まれている場合は、dynamic_cast<>を使用してポインターのタイプを変更できます。

ただし、ポインターの配列は使用しません。stdライブラリコレクションの1つを使用すると、メモリ管理で多くの頭痛の種を減らすことができます...

    void DoSomething(std::vector<property>& properties)
    {
        // do something with...
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        std::vector<property> properties;

        property x;
        x.cost = 1234;

        properties.push_back(x);

        DoSomething(properties);

        return 0;
    }
于 2013-01-08T14:28:16.110 に答える
0

property [i]正方形のポインターであるため、これは正常です。宣言を見てください。

square* properties[23];

これは、 canBeBoughtnameである正方形のクラスメンバーにのみアクセスできることを意味します。

解決策は、次のものを置き換えることです。

properties[i] = new property;

に:

property * prop = new property;
properties[i] = prop;

次に、whileループで、properties[i]->の代わりにprop->を使用します。

于 2013-01-08T14:30:39.400 に答える