C++ 访问实例类的变量
首先,我为不好的标题命名感觉道歉。我不知道如何正确表达它 我的问题是,我有四个给定的类,为了简单起见,我称它们为C++ 访问实例类的变量,c++,testing,C++,Testing,首先,我为不好的标题命名感觉道歉。我不知道如何正确表达它 我的问题是,我有四个给定的类,为了简单起见,我称它们为A,B,C和D D是一个包含大量数据的大型类 C基本上是一个包含许多Ds的表 B是一个单例,它为a提供了一个实例B有一个成员,C*C A包含一个调用B执行某项操作的方法 我想测试D是否存储了正确的信息,并通过A传递给程序 下面是我的代码的简化版本,演示了设置 #include <stdexcept> #include <string> #include &l
A
,B
,C
和D
是一个包含大量数据的大型类D
基本上是一个包含许多C
s的表D
是一个单例,它为B
提供了一个实例a
有一个成员,B
C*C
包含一个调用A
执行某项操作的方法B
D
是否存储了正确的信息,并通过A
传递给程序
下面是我的代码的简化版本,演示了设置
#include <stdexcept>
#include <string>
#include <vector>
class D {
public:
// Greatly simplified; this class holds much more data in reality.
std::string info {};
};
class C {
private:
std::vector<D*> d {};
public:
D* getD(int dNum) {
return this->d.at(dNum);
}
};
class B {
private:
C* c {};
D* d {};
B() {
this->c = new C();
}
~B() {
delete this->c;
}
B(const B&) = delete;
B& operator=(const B&) = delete;
public:
static B* getInstance() {
static B instance {}; // singleton
return &instance;
}
bool doSomething(const std::string& text) {
int dNum = std::stoi(text); // simplified
try {
this->d = this->c->getD(dNum);
this->d->info += text;
return true;
} catch (const std::out_of_range&) {
return false;
}
}
};
class A {
public:
bool someFunction(const std::string& text) {
return B::getInstance()->doSomething(text);
}
};
我已经查看了存根和mock,但我不知道如何在这种情况下使用它们(实际上我从未使用过它们)
再一次,如果我的解释不清楚,很抱歉。我在C++方面很弱,因此不知道如何解释事物。因此,即使是寻找类似的问题也证明是不可能的,所以如果以前有人问过这个问题,我很抱歉
Edit:我知道我可以通过在B中实现一些getter方法来获得C,但我希望得到另一种方法。您还没有显示是否正在为类指针分配内存。在
a->someFunction(testString)中代码>,a
指向哪里?然后,在class B
中,neededD=c->getD(dNum)代码>c
指向哪里?此外,您必须更改行requiredD=d->at(dNum)代码>至requiredD=d.at(dNum)代码>。请提供完整的详细信息,以便更好地理解问题。您尚未显示是否正在为类指针分配内存。在a->someFunction(testString)中代码>,a
指向哪里?然后,在class B
中,neededD=c->getD(dNum)代码>c
指向哪里?此外,您必须更改行requiredD=d->at(dNum)代码>至requiredD=d.at(dNum)代码>。请提供完整的详细信息,以便更好地理解问题。从哪里获得int dNum
?它能从sampleString
计算出来吗?为了简单起见,我假设C只包含一个D,所以int为1。将进行一些编辑以澄清这一点。C
如何进入B
?如果你可以编辑你的例子,这样它们就可以是有效的C++代码。我在保护的构造函数中添加了C =新的C.();我希望它们现在是有效的C++代码,因为我所做的只是删除其他功能,并从程序中重命名我的类/变量,这些程序编译和运行都是正确的。不过,我可能移走了太多=/我已经编辑了您的问题,使示例代码得以编译。这是否仍然反映了你的问题?请注意,没有创建任何D
对象,因此我不确定哪个对象将获得属性集。B::doSomething
从何处获得int dNum
?它能从sampleString
计算出来吗?为了简单起见,我假设C只包含一个D,所以int为1。将进行一些编辑以澄清这一点。C
如何进入B
?如果你可以编辑你的例子,这样它们就可以是有效的C++代码。我在保护的构造函数中添加了C =新的C.();我希望它们现在是有效的C++代码,因为我所做的只是删除其他功能,并从程序中重命名我的类/变量,这些程序编译和运行都是正确的。不过,我可能移走了太多=/我已经编辑了您的问题,使示例代码得以编译。这是否仍然反映了你的问题?请注意,没有创建任何D
对象,因此我不确定哪个对象将获得属性集。另外,requiredD=d->at(dNum)的行与我的代码中使用的行完全相同(如果系统测试是证明的话,它可以正常工作)。我不太理解->someFunction(testString)上的行。你这是什么意思?@Foleosy你的代码片段没有显示A*A代码>指向。您是否创建了A
的对象并将其地址分配给指针A
?我遗漏了A=new A()代码>和c=newc()代码>。对不起,这不是答案-1对于类B上的点,我添加了受保护的构造函数。另外,requiredD=d->at(dNum)的行与我的代码中使用的行完全相同(如果系统测试是证明的话,它可以正常工作)。我不太理解->someFunction(testString)上的行。你这是什么意思?@Foleosy你的代码片段没有显示A*A代码>指向。您是否创建了A
的对象并将其地址分配给指针A
?我遗漏了A=new A()代码>和c=newc()代码>。对不起,这不是答案-1.
void test() {
std::string testString {"1"};
A a {};
a.someFunction(testString);
// How can I test that for the 'D' object 'd', that was manipulated by the
// call to 'someFunction', 'd.info == testString'?
}