【发布时间】: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