Как вызвать переменную класса с разными именами?
Я имею в виду аналогично что-то вроде этого:
class test{
int values[2];
#define right values[0] // <- something like this
#define left values[1]
};
int main(){
test obj;
obj.values[1] = 23; // this is the same thing
obj.left = 23; // <-'
int left = 10; // error, because this is equal to int values[1]=10;
}
Я хочу сделать что-то подобное, но без глобальной замены слов влево и вправо.
Есть ли способ сделать это?
Вы можете использовать злые макросы:
#define right values[0]
#define left values[1]
Другая идея заключается в использовании именованных констант:
const size_t right = 0;
const size_t left = 1;
/...
int r = values[right];
int l = values[left];
Хотя, IMHO, лучше использовать две отдельные переменные вместо массива:
int right;
int left;
Вы также можете использовать указатели:
int * left = &values[1];
int * right = &value[0];
//...
*left = 0;
Вы можете использовать ссылки:
struct test {
int values[2];
int& right = values[0];
int& left = values[1];
};
Обратите внимание, что они являются действительными членами класса, поэтому они принимают неопределенный размер. На практике это не имеет большого значения, так как две ссылки вряд ли велики.
Вы можете просто использовать встроенные методы, которые делают нечто подобное:
class test{
int values[2];
int & right() { return values[0]; }
int const & right() const { return values[0]; }
int & left() { return values[1]; }
int const & left() const { return values[1]; }
};
или используйте ссылки:
class test{
int values[2];
int & right = values[0]; // initialization syntax with C++11 or later. For pre-
int & left = values[1]; // C++11, these must be initialized in the constructor
};
Однако со ссылками, учитывая const test obj
, obj.right
а также obj.left
все еще относятся кconst
целые числа, то есть имеют тип int &
не const int &
, Кроме того, эти дополнительные ссылки увеличивают размер класса.
Попробуйте использовать указатели в классе с именами ‘left’ и ‘right’, чтобы указывать на значения [0] и [1], например
#include <iostream>
using namespace std;
int main() {
int arr[2];
arr[0]=20;
arr[1]=30;
int *x=&arr[0];
int *y=&arr[1];cout<<"x is " << *x;
}