使用结构传递多个值

时间:2013-01-18 08:38:21

标签: c++ function struct

所以我有一个需要两个字符和两个整数的函数:

void need_2xcha_2xint(char a, char b, int x, int y)
{
  cout << "Working! a: " << a << ", b: " << b << ", x : " << x << ", y: " << y << ".\n";
}

我想通过传递一个包含四个值的结构来调用它:

struct Value_Holder
{
char a;
char b;
int x;
int y;

Value_Holder()
    : a('g'), b('h'), x(3), y(5)
  {
  }
};

我希望能够按如下方式调用它:

Value_Holder vh;
need_2xcha_2xint(vh);

当然我可以编写另一个接受我的自定义结构并适当处理它的函数,但我想知道是否有办法告诉struct直接输出四个单独的值。这主要用于与DirectX库进行交互。

我确信这是基本的东西,但我一直在研究c ++的许多不同领域,很难记住一切。我现在已经搜索了一段时间的答案,但我不太确定我应该搜索什么。我的谷歌技能让我失望!

提前致谢。

  • 编辑 -

因为看起来人们对我的问题感到困惑,所以我会在这里尝试简化它:

对于需要2个整数和2个字符的函数,是否有办法接受包含这些值而不是四个单独值的单个结构?

我希望澄清我的问题。

6 个答案:

答案 0 :(得分:3)

包装第三方库:

namespace david {

void need_2xcha_2xint(const Value_Holder& value) {
    ::need_2xcha_2xint(value.a, value.b, value.x, value.y);
}

}

使用它:

int main() {
    Value_Holder value;

    using david::need_2xcha_2xint;
    need_2xcha_2xint(value);
    return 0;
}

修改

我很确定你可以使用模板和函数指针来封装它。

答案 1 :(得分:1)

  

一种告诉结构直接输出四个单独值的方法

如果您的意思是输出std::ostream(例如std::cout),那么为Value_Holder添加流媒体运算符......

std::ostream& operator<<(std::ostream& os, const Value_Holder& v)
{
    return os << "{ a " << v.a << ", b " << b.b << ", x " << x << ", y " << y << " }";
}

然后你可以使用例如:

简洁地打印出来
Value_Holder v;
...
std::cout << "whatever " << v << " some more\n";

答案 2 :(得分:1)

我认为fuchsgeist提供的答案是最好的方法。如果我理解正确,那么你需要将4个参数传递给你的库函数。我希望下面的代码解决了你的问题。

Value_Holder vh;
need_2xcha_2xint(vh.a,vh.b,vh.x,vh.y);

我希望我能正确理解你的问题。

好的我在你的编辑之后得到了你的问题。您可以在此处使用函数重载概念。重载库函数以接受您的结构。这是解决您的问题的方法吗?

答案 3 :(得分:1)

我知道这不是一个很好的决定,你应该避免任何定义,但无论如何,你可以试试这个:

void f(int i, char c)
{
    std::cout << i << " : " << c;
}

struct s
{
    int i;
    char c;
};

#define S_CALL(f, s) (f(s.i, s.c))

int main(int argc, char* argv[])
{
    s param;
    param.i = 1;
    param.c = 'a';

    f(param.i, param.c);
    S_CALL(f, param);

    return 0;
}

当然,将此功能包装在您自己的中并不远。

答案 4 :(得分:1)

  

对于需要2个整数和2个字符的函数,是否有办法接受包含这些值而不是四个单独值的单个结构?

不,没有。

你可以尝试使用预处理器进行不同的技巧,但这是一种错误的死路。

为什么不用这个结构?尽可能多地关注KISS principle

答案 5 :(得分:1)

需要将多个参数传递给函数可以得出结论:需要一个下面的对象。在您的情况下,您创建了结构。

但是不要忘记Single Responsibility Principle,这需要考虑你的课程的责任:一个类应该保持简单明了,而不仅仅是一堆有时无关的参数

在你的情况下,我不确定,但是当我看到(int x,int y)时,我想知道是类Point 还是 Vector ,或班级大小受到威胁。如果是这样的话,我只会在相关的新类中封装int x,int y对。

对于这些问题,我推荐Martin Fowler的书“重构:改进现有代码的设计”。他列出了修改方法,将代码列入更清晰,更易于维护,可修改的状态,以及何时/为何重构代码。