2010-02-06 8 views
9

Supongamos que quiero pasar un objeto temporal a una función. ¿Hay alguna manera de hacer eso en 1 línea de código vs. 2, con una estructura?¿Manera simple de pasar estructura temporal por valor en C++?


Con una clase, que puedo hacer:

class_func(TestClass(5, 7)); 

dado:

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()); 
} 

Ahora, ¿cómo puedo hacer eso con una estructura? El más cercano que tengo es:

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

dado:

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); 
} 

El objeto es más sencillo, pero me pregunto si hay una manera de hacer la inicialización miembro de estructura justo en línea con la llamada de función , sin darle a la estructura un constructor (No quiero un constructor. La razón por la que estoy usando una estructura es para evitar las reglas estándar de la clase get/set en este caso aislado)

+3

todavía se puede escribir una Kee constructor ping las variables miembro público. Por lo tanto, no necesita métodos get/set. ¿Hay algún problema al hacer eso? – Naveen

+0

¿Quería lograr la inicialización de estructuras en C? En C++ una estructura también puede hacer lo que sea que esté haciendo en la clase. – sand

Respuesta

0

No soy experto en C++, pero no podría simplemente coloque la declaración de creación dentro de la lista de argumentos de su llamada de función?

+0

No, algunos compiladores permiten ese tipo de cosas y está en C++ 0x (§5.2.3/3) pero actualmente no es estándar. – Potatoswatter

2

Puede hacerlo de la misma forma que lo hace con la clase. Solo dale a tu estructura un constructor y puedes crearla en línea al igual que la estructura. Sus objeciones sobre el uso de un constructor son infundadas. La principal diferencia entre una clase y una estructura es la visibilidad predeterminada asociada a ella. Para las clases, es privado; para estructuras, público. No hay una "repetición", y no tiene que obedecer ninguna "convención" que no desee.

struct test_struct 
{ 
    int a; 
    short b; 

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

struct_func(test_struct(5, 7)); 
+0

@Terry Mahaffey, definitivamente puede usar la inicialización de llaves con una clase. Las restricciones son las mismas que para struct.La diferencia entre 'struct' y' class' keyword * es * default visibility only (para miembros y clases base). Incluso puede mezclar las palabras clave: 'struct t {}; clase t v; '. – avakar

+0

Sí, tienes razón. Pensé que solo las estructuras podrían ser POD por alguna razón. Retiro mi comentario –

0

Las estructuras también pueden tener constructores, por lo que puede hacer lo mismo con ellas con el ejemplo de la clase.

4

Esto es posible en el C++11 standard. Básicamente, usted puede hacer esto:

struct_func(test_struct{5, 7}); 

Esto ya está disponible en GCC a partir de la versión 4.4.

+0

De hecho, ni siquiera necesita declarar explícitamente el tipo, a menos que exista ambigüedad acerca de los tipos que puede crear la lista inicial respaldada: '#include struct S { int i; doble d; }; void f (S s) { std :: cout << s.i << '' << s.d << std :: endl; } int main (int, char **) { f ({7, 42}); } 'No creo que alguna vez hubiera pasado sin una inicialización uniforme o todas las otras mejoras masivas hechas en C++ 11 que doy por hecho. –

8

Una alternativa para proporcionar un constructor en su estructura, sería proporcionar una función gratuita make_xxx:

struct Point {int x; int y;}; 

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

plot(makePoint(12, 34)); 

Una de las razones por las que podría querer evitar constructores de estructuras es permitir corsé-inicialización de matrices de estructuras:

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

vs

const Point points[] = {Point(12,34), Point(23,45), Point(34,56)}; 
+1

Tenga en cuenta que en C++ 11, el uso puede usar la inicialización de llaves incluso si se define el constructor 'Punto '. En ese caso, los argumentos dentro de las llaves se pasarán al constructor. Esta función se denomina [Inicialización uniforme] (https://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization). –

Cuestiones relacionadas