如何根据bool类型成员函数的返回值调用struct成员函数?

时间:2015-06-21 15:07:56

标签: c++ struct boolean

我想在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;
    }
}

3 个答案:

答案 0 :(得分:1)

有两种方法:用于呼叫者安全的封装和纯代码规则。在稍后您自己确保您编写的代码始终知道memfuncbool的最新结果以及设置ab的时间和地点。

在第一个中,您可以在调用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)

我发现您的代码存在三个错误:

  1. &#34;做&#34;是一个c ++关键字。你不能用它来命名结构。

  2. &#34; memfuncbool&#34;的参数缺少类型。常量和放大器;不是一种类型。

  3. 结构定义后缺少分号。

  4. 另外我认为var1,var2和arg定义良好。如果他们甚至不是一个错误。

    纠正这些错误后,您可以执行类似的操作 -

    if(tempbool) { /*statements*/ };