MyStringStack c++ 无法调用我的方法 class

MyStringStack c++ can't call method of my class

我一直在尝试实现包含 MyString class 对象的 Stack(这是其中一本书的练习)。我设法将这些对象推送到容器中,但是当我想调用函数 void print() 时出现错误:

错误:将 'const MyString' 作为 'void MyString::print()' 的 'this' 参数传递会丢弃限定符 [-fpermissive] cp->print();

代码如下:

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

class MyString
{
    string a;
public:
    MyString(string aa) : a(aa)
    {

    }
    void print()
    {
        cout << a << endl;
    }
};

class StringStack {
  static const int size = 100;
  const MyString* stack[size];
  int index;
public:
  StringStack();
  void push(const MyString* s);     // does this have to be const?
  const MyString* pop();    // does this have to be const?
};

StringStack::StringStack() : index(0) {
  memset(stack, 0, size * sizeof(MyString*));
}

void StringStack::push(const MyString* s) {
  if(index < size)
    stack[index++] = s;
}

const MyString* StringStack::pop() {
  if(index > 0) {
    const MyString* rv = stack[--index];
    stack[index] = 0;
    return rv;
  }
  return 0;
}

MyString s0("pralines & cream");
MyString s1("fudge ripple");
MyString s2("jamocha almond fudge");
MyString s3("wild mountain blackberry");
MyString s4("raspberry sorbet");
MyString s5("lemon swirl");
MyString s6("rocky road");
MyString s7("deep chocolate fudge");

MyString iceCream[] = {s0,s1,s2,s3,s4,s5,s6,s7};
const int iCsz =
  sizeof iceCream / sizeof *iceCream;

int main() {
  StringStack ss;
  for(int i = 0; i < iCsz; i++)
    ss.push(&iceCream[i]);
  const MyString* cp;
  while((cp = ss.pop()) != 0)
  {
      cout << (long)cp << endl;
      // cp->print();    // won't work
  }
} ///:~

您可以:

  1. make void MyString::print() const,好像也有道理

或:

  1. const MyString* pop();变为return非const指针。

我认为 StringStack 不应该存储指向 const 对象的指针。如果您打算永远不修改堆栈中的 MyString 个对象,则将它们在内部保留为 const。选择取决于您的要求。