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
    基本上是一个包含许多
    D
    s的表
  • 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'?
}