是否可以在同一个 class 中将 () 运算符重载为取消引用,将 = 运算符重载为赋值?
Is it possible to overload both the () operator as a dereference and the = operator as assignment in same class?
我正在开发一个程序,该程序有一个 object 指针网格,这些指针指向 Null 值或派生的 child。我希望能够将此网格上的值设置为其派生 child 的地址,以便我可以 "place" 网格上的 child 并通过他们访问 child内存中的位置。
这是网格界面的样子。
class Grid{
public:
virtual int get(g_type) const;
public:
parent* operator() (int,int);
Grid() : _amtCol(10),_amtRow(10)
{construct();}
~Grid() {deconstruct();}
private:
int _amtCol;
int _amtRow;
parent* **_grid;
private:
parent ***meddle(access);
void meddle(access, parent***);
virtual void construct();
virtual void deconstruct();
};
这是 () 重载的样子。
parent* Grid::operator() (int i,int j){
if(i < get(r_QTY) && j < get(c_QTY)){
return this->meddle(key)[i+1][j+1];
}else{return NULL;}
}
我希望能够做的是在我的程序的其余部分中将其称为:
Grid b;
Child c;
Child c2;
b(1,1) = &c;
b(1,4) = &c2;
b(1,1)->foo(); //calls the first Childs foo()
b(1,4)->foo(); //calls the second Childs foo()
我的 classes 的其余部分已创建并在继承和结构方面发挥作用。
有没有一种方法可以链接重载或其他可行的方法?
我认为也许我需要解决 parents 和 child class 中的作业过载问题,但它们似乎工作得很好。
////////////////////////////////////////// ////////
顺便说一句,我确实实现了这个:
void Grid::operator() (int i,int j,parent &cpy){
if(i < get(r_QTY) && j < get(c_QTY)){
this->meddle(key)[i+1][j+1] = &cpy;
}
}
确实允许此功能。
我的论文来了!谢谢!
////////////快速补充:所以也许我不一定需要知道这在道德和伦理上是否公正。我有办法实现有效的功能。我想我确实明白,使用库中已经存在的东西比我自己的创作更受欢迎,但如果你使用 std::vector,它是 do-able 的事实意味着它是可能的。我想知道这是如何实现的,以及它在语言语法中的位置。
不确定你的问题到底是什么,但你可以这样做:
struct parent
{
virtual ~parent() = default;
virtual void foo() = 0;
};
struct Child : parent
{
Child(int n) : n(n) {}
void foo() override { std::cout << n << std::endl;}
int n;
};
class Grid{
public:
Grid() : col(10), row(10), grid(col * row, nullptr) {}
parent* operator() (std::size_t x, std::size_t y) const {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
parent*& operator() (std::size_t x, std::size_t y) {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
private:
int col;
int row;
std::vector<parent*> grid;
};
然后你有:
Grid b;
Child c(1);
Child c2(2);
b(1,1) = &c;
b(1,4) = &c2;
b(1,1)->foo(); //calls the first Childs foo()
b(1,4)->foo(); //calls the second Childs foo()
我正在开发一个程序,该程序有一个 object 指针网格,这些指针指向 Null 值或派生的 child。我希望能够将此网格上的值设置为其派生 child 的地址,以便我可以 "place" 网格上的 child 并通过他们访问 child内存中的位置。
这是网格界面的样子。
class Grid{
public:
virtual int get(g_type) const;
public:
parent* operator() (int,int);
Grid() : _amtCol(10),_amtRow(10)
{construct();}
~Grid() {deconstruct();}
private:
int _amtCol;
int _amtRow;
parent* **_grid;
private:
parent ***meddle(access);
void meddle(access, parent***);
virtual void construct();
virtual void deconstruct();
};
这是 () 重载的样子。
parent* Grid::operator() (int i,int j){
if(i < get(r_QTY) && j < get(c_QTY)){
return this->meddle(key)[i+1][j+1];
}else{return NULL;}
}
我希望能够做的是在我的程序的其余部分中将其称为:
Grid b;
Child c;
Child c2;
b(1,1) = &c;
b(1,4) = &c2;
b(1,1)->foo(); //calls the first Childs foo()
b(1,4)->foo(); //calls the second Childs foo()
我的 classes 的其余部分已创建并在继承和结构方面发挥作用。
有没有一种方法可以链接重载或其他可行的方法?
我认为也许我需要解决 parents 和 child class 中的作业过载问题,但它们似乎工作得很好。
////////////////////////////////////////// ////////
顺便说一句,我确实实现了这个:
void Grid::operator() (int i,int j,parent &cpy){
if(i < get(r_QTY) && j < get(c_QTY)){
this->meddle(key)[i+1][j+1] = &cpy;
}
}
确实允许此功能。
我的论文来了!谢谢!
////////////快速补充:所以也许我不一定需要知道这在道德和伦理上是否公正。我有办法实现有效的功能。我想我确实明白,使用库中已经存在的东西比我自己的创作更受欢迎,但如果你使用 std::vector,它是 do-able 的事实意味着它是可能的。我想知道这是如何实现的,以及它在语言语法中的位置。
不确定你的问题到底是什么,但你可以这样做:
struct parent
{
virtual ~parent() = default;
virtual void foo() = 0;
};
struct Child : parent
{
Child(int n) : n(n) {}
void foo() override { std::cout << n << std::endl;}
int n;
};
class Grid{
public:
Grid() : col(10), row(10), grid(col * row, nullptr) {}
parent* operator() (std::size_t x, std::size_t y) const {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
parent*& operator() (std::size_t x, std::size_t y) {
if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); }
return grid[y * col + x];
}
private:
int col;
int row;
std::vector<parent*> grid;
};
然后你有:
Grid b;
Child c(1);
Child c2(2);
b(1,1) = &c;
b(1,4) = &c2;
b(1,1)->foo(); //calls the first Childs foo()
b(1,4)->foo(); //calls the second Childs foo()