Предположим, что я хочу передать временный объект в функцию. Существует ли способ сделать это в 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);
}
Объект более прост, но интересно, существует ли способ сделать членскую инициализацию структуры правильно в соответствии с вызовом функции, не давая структуре конструктора. (Я не хочу конструктора. Целая причина я использую структуру, состоит в том, чтобы избежать, чтобы шаблон получил/установил конвенции класса в этом единичном случае.)
Альтернативой предоставлению конструктора в вашей структуре, было бы предоставление свободной функции make_xxx:
struct Point {int x; int y;};
Point makePoint(int x, int y) {Point p = {x, y}; return p;}
plot(makePoint(12, 34));
Одна из причин, по которой вы можете захотеть избежать использования конструкторов в структурах, это позволить брауз-инициализацию в массивах структур:
// 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)};
Это можно сделать так же, как и в классе. Просто дайте структуре конструктор, и вы можете создать его в линию, как и структуру. Ваши возражения по поводу использования конструктора необоснованны. Основным отличием класса от структуры является связанная с ним видимость по умолчанию. Для занятий это личное; для структур, общедоступных. Нет «шаблона,» и не нужно подчиняться «условностям,» которые ты не хочешь.
struct test_struct
{
int a;
short b;
test_struct(int a_, int b_): a(a_), b(b_) { }
};
struct_func(test_struct(5, 7));
-121--3320676- Структуры также могут иметь конструкторы, поэтому с ними можно делать то же самое, что и с примером класса.
-121--3320678-Это возможно в стандарте C++ 11 . В основном, вы можете сделать это:
struct_func(test_struct{5, 7});
Это уже доступно в GCC начиная с версии 4.4.
Вы можете сделать это так же, как и с классом. Просто дайте своей структуре конструктор, и вы можете создать его встроенным, как и структуру. Ваши возражения против использования конструктора безосновательны. Основное различие между классом и структурой - это связанная с ним видимость по умолчанию. Для классов это личное; для структур, паблик. Нет никакого «шаблона», и вам не нужно подчиняться никаким «условностям», которых вы не хотите.
struct test_struct
{
int a;
short b;
test_struct(int a_, int b_): a(a_), b(b_) { }
};
struct_func(test_struct(5, 7));
Я не эксперт по C ++, но не могли бы вы просто разместить создание внутри списка аргументов вашего вызова функции?
У структур также могут быть конструкторы, поэтому с ними можно делать то же самое, что и в примере с классом.