【问题标题】:Overloaded function assigning values to the wrong variables [duplicate]重载函数将值分配给错误的变量[重复]
【发布时间】:2015-11-19 13:34:29
【问题描述】:

我环顾四周并进行了一些谷歌搜索,但找不到正确的关键字来解释我的问题。我希望你们中的一些人可以提供帮助。说到 C++,我还是个新手,没有受过任何教育,但我觉得在重载函数时,我实际上已经知道该怎么做,但显然我还没有完全掌握它。

基本上,我正在尝试重载一个函数,以根据实际提供的变量将某些变量初始化为默认值。我想我也许可以改用默认值,但我花了很长时间弄清楚它们是如何工作的。

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

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 =

谁能向我解释我哪里出错了,我应该如何解决它?谢谢!

作为一个快速的旁注;我确实意识到可以使用实际的初始化来代替我自己的初始化,但是在我实际执行此操作的项目中,我需要大范围的 Foo 对象,同时仅在一些代码已经运行后才初始化它们.

【问题讨论】:

  • 作为一个简短的旁注; 不,说真的,init 函数是一种糟糕的反模式。
  • 尽管这不是我在这篇文章中的目标,但我想听听“init”函数的替代方案,因为我很清楚它们实际上是多么糟糕。
  • ^^ 也不要使用 _ 作为前缀,因为它是为 c++ 内部实现保留的。作为后缀使用是可以的。
  • 我只是为了简化示例代码中的内容。我实际上并没有在真正的代码中这样做,只是认为对其他人来说更容易遵循。不过,这绝对是件好事。
  • this 不是更简洁的测试用例吗?

标签: c++ overloading


【解决方案1】:

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

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

【讨论】:

  • 不,const char[6],然后是const char*。永远不是char*
  • 谢谢@Anthony!这一直是我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多