2016-11-17 65 views
1

,我发现了错误:C++动态构造

no operator "[]" matches these operands

对于行:

cout << A[j].display(n) 

但是,当我拿出[j],我得到的错误:

class "list" has no member "display"

这是我的代码:

class list 
{ 
protected: 
    int *p; // pointer to a list 
    int size; // dimension 
public: 
    list(int x) 
    { 
     size = x; 
     p = new int[size]; 
    } 
    void get(int i, int val) 
    { 
     p[i] = val; 
    } 
}; 

class dlist : public list 
{ 
public: 
    int display(int i) 
    { 
     return p[i]; 
    } 
}; 

int main() 
{ 
    int n; 
    cout << "Enter elements in a row\n"; 
    cin >> n; 

    list A(n); 

    int j, val; 
    for (j = 0; j < n; j++) 
    { 
     cin >> val; 
     A.get(j, val); 
    } 
    cout << "\n"; 
    cout << "List of elements are :\n"; 
    cout << "----------------------\n"; 
    for (j = 0; j < n; j++) 
     cout << A[j].display(j) << "\t"; 
    cout << "\n"; 
    return 0; 
} 

请帮忙!

+2

'A'不是数组,也没有重载'[]'运算符。并且,请格式化您的代码。 –

+0

此外,'A'是一个'list'对象,而不是'dlist'对象,所以它没有'display'成员。 –

回答

1

该类list确实没有会员功能display。它是类dlist宣称像

class dlist : public list 
//... 

有这样一个成员函数。然而,对象A主定义像类list

list A(n); 

的对象。此外,因为你必须显式定义的类型的构造函数,你不能创建类型dlist的对象。

如果你想使用多态,然后引入虚拟功能,例如像虚拟成员函数display

而且此语法

cout << A[j].display(j) << "\t"; 
     ^^^^^^^^^^^^^^ 

不正确,因为对象A是一个标量对象。它不是一个对象数组,并且类没有超载operator []

您应该首先明确定义一个虚拟析构函数(否则在程序中可能存在内存泄漏),它会在构造函数中使用参数,复制构造函数和复制赋值运算符在类列表中删除动态分配的内存。然后你可以定义下标操作符等等。

+0

@JohnnyMopp谢谢。看来我已经正确地更新了这篇文章。:) –