Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟get和set函数的替代方案?_C++_Oop - Fatal编程技术网

C++ 虚拟get和set函数的替代方案?

C++ 虚拟get和set函数的替代方案?,c++,oop,C++,Oop,我遇到了需要使用虚拟get和set函数来访问派生类成员的情况。然而,正如在的答案中所指出的(顺便说一句,这与我的问题非常相似),这是一种糟糕的做法,可能意味着我的课程需要重新设计。问题是。。。我对C++和OOP都是新的,所以我不确定我可以用不同的方式来编写我的代码。 如果你有耐心,我会解释我的情况:我正在编写一个代码,可以解决两种不同类型的问题(比如ProblemX和ProblemY)。根据用户输入,您只能同时解决problemX、ProblemY或两者。如果只想解决ProblemX,只需要一个

我遇到了需要使用虚拟get和set函数来访问派生类成员的情况。然而,正如在的答案中所指出的(顺便说一句,这与我的问题非常相似),这是一种糟糕的做法,可能意味着我的课程需要重新设计。问题是。。。我对C++和OOP都是新的,所以我不确定我可以用不同的方式来编写我的代码。 如果你有耐心,我会解释我的情况:我正在编写一个代码,可以解决两种不同类型的问题(比如ProblemX和ProblemY)。根据用户输入,您只能同时解决problemX、ProblemY或两者。如果只想解决ProblemX,只需要一个名为“memberX”的变量。如果你只想解决问题,你只需要“成员”。如果您想同时解决这两个问题,则需要“memberX”和“memberY”,但问题将相互依赖,因此无法单独解决每个问题。简而言之,代码是这样的:

#include <vector>

class Problem
{
public:
    double memberX;
    double memberY;
};

class MainProblem
{
public:
    std::vector<Problem*> problems;
};

int main()
{
    bool solveProblemX = true; // This variable will depend on user input
    bool solveProblemY = true; // This variable will depend on user input
    
    MainProblem * mainProblem = new MainProblem();
    for (int i = 0; i < 10000; i++)
    {
        Problem * problem = new Problem();
        mainProblem->problems.push_back(*problem);
    }
    
    if (solveProblemX && solveProblemY)
    {
        // Solve interconnected problem, using "mainProblem->problem[i]->memberX" and "mainProblem->problem[i]->memberY";
    }
    else if (solveProblemX)
    {
        // Solve individual problem, using only "mainProblem->problem[i]->memberX";
    }   
    else if (solveProblemY)
    {
        // Solve individual problem, using only "mainProblem->problem[i]->memberY";
    }
    else
    {
        // throw some exception
    }
}

我的问题是关于类上的虚拟get函数
问题
。我同意,这感觉很奇怪,因为变量
memberX
memberY
不属于类
问题。但是,如果没有它,我将无法调用
mainProblem->problems[I]->getMemberX()
,因为
mainProblem->problems[I]
是基类
Problem
的对象,而不是派生类。正如我所说,我的程序内存非常昂贵。这就是为什么我选择在类
MainProblem
中有一个
Problem
s向量,而不是多个向量,每个派生类一个向量。我的结构有问题吗?我真的应该重新设计它吗?如果是这样,你能想出一个替代方案吗?

我不明白为什么需要公开
memberX
memberY
。使用它们可能需要更多的伪代码?除了存储
memberX
memberY
之外,
Problem
还有什么作用?如果
Problem
用于存储对象,那么您只需要一个容器,而不是派生的
Problem
,根据当前上下文,我建议为
Problem
使用纯虚拟函数
Solve
。除非
member
必须公开。@LouisGo对不起,我不明白你说的“公开”是什么意思。是否因为成员在第一个代码中是公共的?那是个错误
memberX
memberY
实际上是具有get和set函数的私有成员,正如我在第二段代码中所说的那样。另外,在真正的代码中,
问题
不仅仅是存储
memberX
memberY
,所以我需要保持这种结构。我不认为有一个私有成员实例,然后在它旁边为它声明一个getter有什么意义。更好的方法是将这些变量声明为常量,简单的结构就足够了。没有必要使用getter。
#include <vector>

class Problem
{
public:
    virtual double getMemberX(){ // Throw some exception};
    virtual double getMemberY(){ // Throw some exception};
};

class ProblemX : public Problem
{
private:
    double memberX;
public:
    double getMemberX(){ return memberX; };
};

class ProblemY : public Problem
{
private:
    double memberY;
public:
    double getMemberY(){ return memberY; };
};

class ProblemXandY : public ProblemX, public ProblemY
{};

class MainProblem
{
public:
    std::vector<Problem*> problems;
};

int main()
{
    bool solveProblemX = true; // This variable will depend on user input
    bool solveProblemY = true; // This variable will depend on user input
    
    MainProblem * mainProblem = new MainProblem();
    for (int i = 0; i < 10000; i++)
    {
        Problem * problem;
        
        if (solveProblemX && solveProblemY)
            problem = new ProblemXandY();
        else if (solveProblemX)
            problem = new ProblemX();
        else if (solveProblemY)
            problem = new ProblemY();
        else
            // throw some exception
        
        mainProblem->problems.push_back(*problem);
    }
    
    if (solveProblemX && solveProblemY)
    {
        for (int i = 0; i < 10000; i++)
        {
            double memberX = mainProblem->problems[i]->getMemberX();
            double memberY = mainProblem->problems[i]->getMemberY();
            // Solve interconnected problem, using "memberX" and "memberY"
        }
    }
    else if (solveProblemX)
    {
        for (int i = 0; i < 10000; i++)
        {
            double memberX = mainProblem->problems[i]->getMemberX();
            // Solve individual problem, using only "memberX";
        }
    }   
    else if (solveProblemY)
    {
        for (int i = 0; i < 10000; i++)
        {
            double memberY = mainProblem->problems[i]->getMemberY();
            // Solve individual problem, using only "memberY";
        }
    }
    else
    {
        // throw some exception
    }
}