编译此代码时遇到问题:
#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
函数,同样的错误仍然存在。
答案 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
方法的skupina2
或Add
}对象?
您需要明确说明您想要Add
某个对象:skupina1.Add(Class1("Prvi"));
或skupina2.Add(Cass1("Prvi"));
。