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
}
} ///:~
您可以:
- make
void MyString::print()
const,好像也有道理
或:
- 将
const MyString* pop();
变为return非const指针。
我认为 StringStack
不应该存储指向 const 对象的指针。如果您打算永远不修改堆栈中的 MyString
个对象,则将它们在内部保留为 const
。选择取决于您的要求。
我一直在尝试实现包含 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
}
} ///:~
您可以:
- make
void MyString::print()
const,好像也有道理
或:
- 将
const MyString* pop();
变为return非const指针。
我认为 StringStack
不应该存储指向 const 对象的指针。如果您打算永远不修改堆栈中的 MyString
个对象,则将它们在内部保留为 const
。选择取决于您的要求。