错误:无法在没有对象的情况下调用成员函数

时间:2015-04-17 11:57:36

标签: c++

编译此代码时遇到问题:

#include <iostream>
#include <vector>
using namespace std;

class Class1
{   
    public:
        string m_Ime;
        Class1(const string ime);
};

Class1::Class1(string const ime):
    m_Ime(ime)
{}

class Class2
{
    public:
        vector <Class1> m_Class1;
        Class2(int mesta);
        void RollCall();
        void Add(const Class1& aClass1);
};

Class2::Class2(int mesta)
{
    m_Class1.reserve(mesta);
}

void Class2::RollCall()
{
    for(int x = 0; x < m_Class1.size(); x++){
        cout << m_Class1[x].m_Ime << endl;
    }

}

void Class2::Add(const Class1& aClass1)
{
    m_Class1.push_back(aClass1);
}

int main(){
    Class2 skupina (3);

    Class2::Add(Class1 ("Prvi"));
    Class2::Add(Class1 ("Drugi"));
    Class2::Add(Class1 ("Tretji"));

    skupina.RollCall();

    return 0;
}

它只不过是我试图学习聚合的基础知识。但是,在尝试编译代码时,它会给我以下错误:

  

在功能&#39; int main()&#39;:

     

46 29 [错误]无法调用成员函数&#39; void Class2 :: Add(const Class1&amp;)&#39;没有对象

     

47 30 [错误]无法调用成员函数&#39; void Class2 :: Add(const Class1&amp;)&#39;没有对象

     

48 31 [错误]无法调用成员函数&#39; void Class2 :: Add(const Class1&amp;)&#39;没有对象

即使我实例化了Class1类型的3个对象,然后使用它们作为参数调用Add函数,同样的错误仍然存​​在。

2 个答案:

答案 0 :(得分:3)

成员函数在实例上运行。但要指定成员函数将在哪个实例上运行,您需要在该实例上调用函数

要这样做,而不是类名,请使用一个表达式来计算该实例(例如,您声明的自动变量):

skupina.Add(...);

现在,成员函数将知道要操作的实例。

答案 1 :(得分:2)

你想:

skupina.Add(Class1 ("Prvi"));
skupina.Add(Class1 ("Drugi"));
skupina.Add(Class1 ("Tretji"));

而不是:

Class2::Add(Class1 ("Prvi"));
Class2::Add(Class1 ("Drugi"));
Class2::Add(Class1 ("Tretji"));

请考虑以下事项:

Class2 skupina1 (3);
Class2 skupina2 (3);

Class2::Add(Class1 ("Prvi"));

编译器如何知道应该调用skupina1方法的skupina2Add}对象?

您需要明确说明您想要Add某个对象:skupina1.Add(Class1("Prvi"));skupina2.Add(Cass1("Prvi"));

相关问题