10

一時オブジェクトを関数に渡したいとします。構造体を使用して、1行のコードと2行のコードでそれを行う方法はありますか?


クラスを使用すると、次のことができます。

class_func(TestClass(5, 7));

与えられた:

class TestClass
{
private:
    int a;
    short b;

public:
    TestClass(int a_a, short a_b) : a(a_a), b(a_b)
    {
    }

    int A() const
    {
        return a;
    }

    short B() const
    {
        return b;
    }
};

void class_func(const TestClass & a_class)
{
    printf("%d %d\n", a_class.A(), a_class.B());
}

さて、構造体でそれを行うにはどうすればよいですか?私が持っている最も近いものは次のとおりです。

test_struct new_struct = { 5, 7 };
struct_func(new_struct);

与えられた:

struct test_struct
{
    int a;
    short b;
};

void struct_func(const test_struct & a_struct)
{
    printf("%d %d\n", a_struct.a, a_struct.b);
}

オブジェクトはより単純ですが、構造体にコンストラクターを与えずに、関数呼び出しに沿って構造体メンバーの初期化を行う方法があるかどうか疑問に思います。(コンストラクターは必要ありません。私が構造体を使用している理由は、この孤立したケースで定型的な get/set クラス規則を回避するためです。)

4

5 に答える 5

10

構造体にコンストラクターを提供する代わりに、make_xxx フリー関数を提供することもできます。

struct Point {int x; int y;};

Point makePoint(int x, int y) {Point p = {x, y}; return p;}

plot(makePoint(12, 34));

構造体でコンストラクターを避けたい理由の 1 つは、構造体の配列でブレースの初期化を許可することです。

// Not allowed when constructor is defined
const Point points[] = {{12,34}, {23,45}, {34,56}};

const Point points[] = {Point(12,34), Point(23,45), Point(34,56)};
于 2010-02-06T07:28:33.887 に答える
7

これは、C++11 標準で可能です。基本的に、これを行うことができます:

struct_func(test_struct{5, 7});

これは、バージョン 4.4 の GCC ですでに利用可能です。

于 2010-02-06T07:15:26.137 に答える
2

クラスで行うのと同じ方法で行うことができます。構造体にコンストラクターを与えるだけで、構造体と同じようにインラインで作成できます。コンストラクターの使用に関するあなたの異議には根拠がありません。クラスと構造体の主な違いは、それに関連付けられているデフォルトの可視性です。クラスの場合は非公開です。構造体の場合、パブリック。「ボイラープレート」はなく、従いたくない「慣習」に従う必要もありません。

struct test_struct
{
    int a;
    short b;

    test_struct(int a_, int b_): a(a_), b(b_) { }
};

struct_func(test_struct(5, 7));
于 2010-02-06T07:13:26.177 に答える
0

私は C++ の専門家ではありませんが、作成ステートメントを関数呼び出しの引数リスト内に配置することはできませんか?

于 2010-02-06T07:07:58.777 に答える
0

構造体はコンストラクターを持つこともできるので、クラスの例で行ったのと同じことをそれらで行うことができます。

于 2010-02-06T07:13:38.853 に答える