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 类,因为这将使以后在我的程序中变得更容易。

4

3 回答 3

1

我猜您的问题是编译器无法将您的“属性”指针识别为指向类属性的实例,因为您将它们保存为指向 Square 的指针。将 properties[i] 转换为指向类 Property ( ((property*)properties[i])->colour) 的指针应该可以解决问题(您明确告诉编译器这实际上是那个类,并且您已确保它不能是另一个类)。

如果 Property 和 Special_Square 实际上不是 Squares,那么多态在这里可能是错误的选择。还有其他方法可以完成任务,例如通过一系列变体。

于 2013-01-08T14:31:01.473 回答
0

你为什么不只拥有一个派生类型的数组?数组是否需要包含多种Square?如果是这样,您可以使用 dynamic_cast<> 来更改指针的类型。

但是,我不会使用指针数组。如果您使用其中一个 std 库集合,您将在内存管理方面省去很多麻烦......

    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

这很正常,因为properties[i]是一个方形指针,请查看您的声明:

square* properties[23];

这意味着您只能访问square类成员,即canBeBoughtname

解决方法是更换:

properties[i] = new property;

经过:

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

然后,在您的while循环中,只需使用prop->而不是properties[i]->

于 2013-01-08T14:30:39.400 回答