2016-08-12 7 views
0

Можно ли установить несколько разных членов класса в одном выражении? Просто пример того, как это будет сделано:C++ Установить несколько членов класса

class Animal 
{ 
    public: 
     int x; 
     int y; 
     int z; 
}; 

void main() 
{ 
    Animal anml; 

    anml = { x = 5, y = 10, z = 15 }; 
} 
+2

'силы основных()' является незаконным в C++. Вы хотите изменить это на 'int main()' перед получением билета. –

+3

Вы хотите посмотреть, что такое [aggregate] (http://stackoverflow.com/q/4178175/2069064). – Barry

ответ

2

Чтобы «преобразовать» комментарий Барри в ответ, да, под the conditions here:

Агрегат представляет собой массив или класс (пункт 9) без объявленных пользователем конструкторов (12.1), без частных или защищенных нестатических данных (раздел 11), без базовых классов (раздел 10) и без виртуальных функций (10.3).

Пример:

class Animal 
{ 
    public: 
     int x; 
     int y; 
     int z; 
}; 

int main() { 
    Animal anml; 

    anml = { 5, 10, 15 }; 
    return 0; 
} 

(. Этот ответ Community Wiki был добавлен в соответствии с this meta post)

1

Вы всегда могут перегрузки конструкторов или создать методы, которые «установить несколько различных свойства объекта в одном операторе ":

class Animal { 
public: 
    Animal() { 

    }; 

    Animal(int a, int b, int c) { 
    x = a; 
    y = b; 
    z = c; 
    } 

    void setMembers(int a, int b, int c) { 
    x = a; 
    y = b; 
    z = c; 
    } 

private: 
    int x; 
    int y; 
    int z; 
}; 

int main() { 
    // set x, y, z in one statement 
    Animal a(1, 2, 3); 

    // set x, y, z in one statement 
    a.setMembers(4, 5, 6); 

    return 0; 
} 
0

Решение 1 для животных (http://ideone.com/N3RXXx)

#include <iostream> 

class Animal 
{ 
    public: 
     int x; 
     int y; 
     int z; 
     Animal & setx(int v) { x = v; return *this;} 
     Animal & sety(int v) { y = v; return *this;} 
     Animal & setz(int v) { z = v; return *this;} 
}; 

int main() { 
    Animal anml; 
    anml.setx(5).sety(6).setz(7); 
    std::cout << anml.x << ", " << anml.y << ", " << anml.z << std::endl; 
    return 0; 
} 

Раствор 2 для любого класса с x, y (https://ideone.com/xIYqZY)

#include <iostream> 

class Animal 
{ 
    public: 
     int x; 
     int y; 
     int z; 
}; 


template<class T, class R> T& setx(T & obj, R x) { obj.x = x; return obj;} 
template<class T, class R> T& sety(T & obj, R y) { obj.y = y; return obj;} 

int main() { 
    Animal anml; 
    sety(setx(anml, 5), 6); 
    std::cout << anml.x << ", " << anml.y << std::endl; 
    return 0; 
}