【问题标题】:Changing address of a struct in C++ by ++ and -- operator通过 ++ 和 -- 运算符更改 C++ 中结构的地址
【发布时间】:2012-10-05 17:12:09
【问题描述】:

是否可以使用 -- 或 ++ 运算符更改我当前结构的地址,即:

mystruct* test = existing_mystruct;
test++ // instead of using: test = test->next_p;

我试图使用它,但它似乎是 const 并给了我一个错误:分配给这个(不合时宜):

struct mystruct {
    mystruct* next_p;
    mystruct* prev_p;

    void operatorplusplus  () { this = next_p; }
    void operatorminusminus() { this = prev_p; }
};

【问题讨论】:

  • this = (anything) 极不可能在标准编译器中工作。 IIRC this 被认为是 const。
  • @cHao: IIRC this 是一个右值表达式,比const 更难赋值。
  • 历史记录:this 曾经是可修改的,早在早期;在构造函数中分配给 this 类似于今天的放置 new。
  • @PeteBecker 所以你会失去你曾经占用的内存?
  • @SethCarnegie - 我已经告诉了你我所知道的一切。

标签: c++ struct operator-keyword


【解决方案1】:

对象在存在时在内存中具有恒定地址。 不过,您可以将它们复制到新地址。

您尝试做的是在链表中前进。如果您重载它们,则可以使用这些运算符完成。但是你需要在一个特殊的句柄类中定义它来包裹列表节点。

编辑

我描述的代码看起来有点像这样:

class mylist
{
  struct mynode
  {
    //data
    mynode* next;
    mynode* prev;
  } *curr;

public:
 mylist& operator++() {curr = curr->next; return *this;}
};

你自然会想做边界检查之类的,但这是一般的想法。

【讨论】:

  • 感谢您的回答。那么是否可以重载这些运算符以获得指向该结构的指针?
  • 可以为任何类/结构重载它们。但是,如果您想在列表中前进,则需要一个 wrapper。给我一点时间来编辑我的答案。
  • 太棒了,这就是我想要的。谢谢!
  • @DimaRudnik 也许包装器更好的名字是mylist_iterator
  • @anatolyg,也许。但由于nextgetprev 的经典双向链表api 可以替换为适当的运算符,因此列表有点像它自己的运算符。
【解决方案2】:

没有。 this指针的类型是mystruct * const,也就是说它的地址是不可改变的。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多