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