重载函数将值分配给错误的变量

时间:2015-08-25 17:57:15

标签: c++ overloading

我环顾四周并做了一些谷歌搜索,但我找不到合适的关键字来找到我的问题的解释。我希望你们中的一些人可以提供帮助。在谈到C ++时,我仍然相当新,没有受过教育,但我觉得在重载函数时,我实际上已经知道要做什么,但显然我还没有完全掌握它。 / p>

基本上,我试图重载一个函数,根据实际提供的变量将某些变量初始化为默认值。我想我可能会使用默认值,但我很想知道它们是如何工作的。

所以实际的代码看起来像这样:

foo.h中

#pragma once

#include <string>

class Foo
{
private:
    int a;
    int b;
    int c;
    int d;
    bool boo;
    std::string baz;
public: 
    Foo();
    void init(int _a, int _b, int _c, int _d, bool _boo, std::string _baz);
    void init(int _a, int _b, int _c, bool _boo);
    void init(int _a, int _b, int _d, std::string _baz);
    void printData();
};

Foo.cpp中

#include <iostream>
#include "foo.h"

Foo::Foo(){

}

void Foo::init(int _a, int _b, int _c, int _d, bool _boo, std::string _baz) {
    a = _a;
    b = _b;
    c = _c;
    d = _d;
    boo = _boo;
    baz = _baz;
}

void Foo::init(int _a, int _b, int _c, bool _boo) {
    a = _a;
    b = _b;
    c = _c;
    d = 0;
    boo = _boo;
    baz = "";
}

void Foo::init(int _a, int _b, int _d, std::string _baz){
    a = _a;
    b = _b;
    c = -1;
    d = _d;
    boo = 0;
    baz = _baz;
}

void Foo::printData() {
    std::cout << "a = " << a << " | b = " << b << " | c = " << c << " | d = " << d << " | boo = " << boo << " | baz = " << baz << std::endl;
}

的main.cpp

#include "foo.h"

Foo foo_1;
Foo foo_2;
Foo foo_3;

int main(int argc, char const *argv[])
{
    foo_1.init(1,2,3,4,false, "First"); // All variables are set by arguments
    foo_2.init(1,2,3,false); // d and baz are set to a default value
    foo_3.init(1,2,4,"Thrid"); // c and boo are set to a default value

    foo_1.printData();
    foo_2.printData();
    foo_3.printData();
    return 0;
}

我在运行Raspbian的RaspberryPi上使用g ++编译此代码。我使用的命令如下:

g++ -o test main.cpp foo.cpp foo.h

现在,鉴于我对c ++的了解有限,我希望输出看起来像这样:

a = 1 | b = 2 | c = 3 | d = 4 | boo = 0 | baz = First
a = 1 | b = 2 | c = 3 | d = 0 | boo = 0 | baz =
a = 1 | b = 2 | c = -1 | d = 4 | boo = 0 | baz = Third

但它是这样的:

a = 1 | b = 2 | c = 3 | d = 4 | boo = 0 | baz = First
a = 1 | b = 2 | c = 3 | d = 0 | boo = 0 | baz =
a = 1 | b = 2 | c = 4 | d = 0 | boo = 1 | baz =

有人可以向我解释我哪里出错了,我该怎么办呢?谢谢!

快速侧面说明;我确实意识到可以使用实际的初始化代替我自己的inits,但是在项目中我实际上是这样做的,我需要大范围的Foo对象,同时只有在一些代码已经完成之后仍然初始化它们已经运行了。

1 个答案:

答案 0 :(得分:0)

您引用的“字符串”被解释为“const char [6],然后是const char *”并转换为布尔值而不是std :: string类。您可以通过添加类型转换强制转换为字符串,例如

foo_3.init(1,2,4,static_cast<std::string>("Thrid"));