我想在struct的bool成员函数中进行一些条件检查。我的struct对象struct1如何知道bool成员函数返回true,因此整数a& b可以在calc成员函数中使用吗?
int main() {
vector<Point> pt;
pt.push_back(Point{ 1.5, 4.2 });
pt.push_back(Point{ 2.4, 3.1 });
doSth struct1;
bool tempbool = struct1.memfuncbool(pt); //error starts here!
if (tempbool) {int answer = struct1.calc(1);} //??
std::cout << answer;
return 0;
}
struct Point {
double _x;
double _y;
};
struct doSth {
int a, b; //data members
int calc(const int k) {
return (a + b)*k;
}
bool memfuncbool(const vector<Point> &pts) {
//does stuff...
a = var1; //var1 = 1
b = var2; //var2 = 2
return true;
}
}
答案 0 :(得分:1)
有两种方法:用于呼叫者安全的封装和纯代码规则。在稍后您自己确保您编写的代码始终知道memfuncbool
的最新结果以及设置a
和b
的时间和地点。
在第一个中,您可以在调用memfuncbool时设置的结构中添加一个标志并检入calc(并适当地处理它。)在这种情况下,您还应该确保在初始化结构时清除该标志 - 要么是通过构造函数,要么是代码规则(就像你的结构总是为零)。
第一种意义上的信息隐藏方法(C ++)如下所示:
class DoSth {
int a, b;
bool valid;
public:
DoSth() : valid(false) { }
bool isValid() const { return valid; }
/// returns calc if valid, otherwise 0
int calc(int k) const {
return isValid() ? (a + b) * k : 0;
}
void setSth(...) {
a = ...
b = ...
valid = true;
// instead of returning here the caller can check isValid() anytime
}
};
答案 1 :(得分:1)
如果您没有尝试做比您所知更多的事情,那么您的代码有很多问题可以轻松解决。
1您在主函数之后定义了Point和doSth结构。所以主要功能无法知道你的结构是做什么的。通常,您将使用头文件来包含声明和cpp文件以包含实现,但是由于您正在执行一个小程序,您可以将结构的定义移动到主函数之上。或者,你可以在main上面声明你的结构并在下面实现它们,就像这样。
// Definition of struct Point
struct Point {
double _x;
double _y;
};
// Definition of struct doSth
struct doSth {
int a, b; //data members
// **Declaration** of doSth methods
int calc(const int k);
bool memfuncbool(const std::vector<Point> &pts);
};
int main() {
...
}
// Definition of calc method
int doSth::calc(const int k) {
...
}
// Definition of memfuncbool method
bool doSth::memfuncbool(const std::vector<Point> &pts) {
...
}
2在main函数中,你在一个不知道这种变量的范围内使用一个名为answer的变量。
if (tempbool) {
int answer = struct1.calc(1);
}
std::cout << answer; // ERROR: answer is not a known variable
请参阅,您在if条件中声明变量但在外部使用它。如果要使用变量,则必须在外部声明变量。
int answer = 0;
if ( tempbool ) {
answer = struct1.calc(1);
}
std::cout << answer << std::endl; // OK
OR
if ( tempbool ) {
int answer = strut1.calc(1);
std::cout << answer << std::endl;
}
else {
std::cout << "Invalid result!" << std::endl;
}
这是一个修复程序,用于编译到目前为止已完成的操作。但这不是您的代码设计问题的解决方案。
3 代码设计 虽然我建议对代码进行快速修复,但实际问题与设计类和构造代码的方式有关。我已经向您展示了代码中出错的地方,但您可以使用更好的结构化方法解决问题。
在写我的答案时,Beyeler已经为你回答了这一部分,所以请检查他的答案。
修改强>
在你的代码中你可能正在做
using namespace std;
但您已经同时撰写了vector< Point >
和std::cout
。您不应该首先使用using
行,以避免名称冲突,并帮助您了解此向量的来源。
但是,如果您坚持使用此行,那么您不必编写std::
(如果您知道自己在做什么就没问题),请不要输入std::
一件事然后在另一件事中省略它。保持一致,无论是使用还是不使用。
答案 2 :(得分:0)
我发现您的代码存在三个错误:
&#34;做&#34;是一个c ++关键字。你不能用它来命名结构。
&#34; memfuncbool&#34;的参数缺少类型。常量和放大器;不是一种类型。
结构定义后缺少分号。
另外我认为var1,var2和arg定义良好。如果他们甚至不是一个错误。
纠正这些错误后,您可以执行类似的操作 -
if(tempbool) { /*statements*/ };