我正在学习c ++中的类和对象,并尝试使用以下代码来测试我是否理解它:
#include <iostream>
using namespace std;
class class1
{
public:
void write(int x)
{
dataObject.var = x;
}
};
class class2
{
public:
void read()
{
std::cout << dataObject.var;
}
};
class data
{
public:
int var;
data()
{
var = 1;
}
};
int main()
{
data dataObject;
class1 object1;
class2 object2;
object2.read(data dataObject);
object1.write(2);
object2.read(data dataObject);
return 0;
}
这是两个对象都用于修改和使用第三个成员但我得到以下错误:
In member function 'void class1::write(int)':
line 10: error: 'dataObject' was not declared in this scope
In member function 'void class2::read()':
line 14: error: 'dataObject' was not declared in this scope
In function 'int main()':
line 40 + 42: error: expected primary-expression before 'dataObject'
知道我哪里错了吗? 提前谢谢。
编辑: 感谢所有的建议。我现在的代码是:
#include <iostream>
using namespace std;
class class1
{
public:
void write(data &dataObject, int x)
{
dataObject.var = x;
}
};
class class2
{
public:
void read(data dataObject)
{
std::cout << dataObject.var << endl;
}
};
class data
{
public:
int var;
data()
{
var = 1;
}
};
int main()
{
data dataObject;
class1 object1;
class2 object2;
object2.read(dataObject);
object1.write(dataObject,2);
object2.read(dataObject);
return 0;
}
我现在得到了错误:
8错误:'data'尚未声明
10错误:请求'dataObject'中的成员'var',这是非类型'int'
18错误:'数据'尚未声明
20错误:请求'dataObject'中的成员'var',这是非类型'int'
40错误:未在此范围内声明'dataObject'
答案 0 :(得分:5)
出现问题的地方是:
void write(int x)
{
dataObject.var = x;
}
没有dataObject
。您正在尝试使您的类依赖于某个全局对象。首先,你必须决定你是否真的想要这个。如果你这样做,你需要一种方法来确保这些全局对象在被类使用之前被声明和实例化。
有很多方法可以解决这个错误,但首先你需要明确你希望这些类做什么以及它们应该如何相互交互。
如何在没有全局对象的情况下解决此问题的一个示例:
class class1
{
public:
class1(data& dataObj) : dataRef_(dataObj) {}
void write(int x)
{
dataRef_.var = x;
}
private:
data& dataRef_;
};
然后在主要:
int main()
{
data dataObject;
class1 object1(dataObject);
object1.write(2);
}
答案 1 :(得分:2)
您的课程不了解变量dataObject
。如果您希望它们能够访问类data
的实例,则需要将它们传递给您的函数。重新定义这样的函数
void read(const data& dataObject)
{
std::cout << dataObject.var;
}
如果您希望能够执行此操作,请在您的类中使用或类data
的成员变量。
从设计的角度来看,除了对类数据实例执行操作之外,您的类不会执行任何操作。您可以将这两个类组合到包含类data
的对象作为成员变量的新类中。您可以拥有该新类的多个函数(读/写)来对内部data
成员进行修改/输出。拥有2个单独的类并没有多大意义,这些类的唯一目的是修改另一个不是成员变量的变量。
答案 2 :(得分:0)
您将参数传递给成员函数read
和write
,但这些函数未定义为接受参数。
将它们重新定义为:
// for class1:
void write(data &dataObject, int x)
{
dataObject.var = x;
}
// for class2:
void read(data dataObject)
{
std::cout << dataObject.var << endl;
}
此外,当你传递这些对象时,不要在它们前面添加data
类型:你已经声明了变量,现在你只需要:
int main()
{
data dataObject;
class1 object1;
class2 object2;
object2.read(dataObject);
object1.write(dataObject, 2);
object2.read(dataObject);
}