首先,我想要清楚的是,这是我过去的家庭作业,但我无法理解,而且我仍然试图绕过头脑。这些是辅助构造函数的说明:
NIUString :: NIUString(const char * other)
NIUString类的构造函数应该将新的
NIUString
对象初始化为C字符串other
。所需的逻辑是:
将新对象的字符串大小设置为C字符串other
的长度 将新对象的字符串容量设置为字符串大小 如果字符串容量为0,则将新对象的字符串数组指针设置为nullptr
。否则,使用字符串数组指针为新对象分配char数组。新字符串数组中的元素数应等于字符串容量 将C字符串other
的字符(最多但不包括空字符)复制到字符串数组中。
对于我的输出我应该得到
测试第二个构造函数
s2:一些文字
s2尺寸:9
s2容量: 9
s2不为空
但我得到......
测试第二个构造函数
s2:一些文字
s2尺寸:9
s2容量: 8
s2不为空
经过研究后,我了解到这是因为你不能在指针上使用sizeof
,因为它只会给你内存中指针的大小,而不是字符串容量的实际大小。 / p>
这是我编写的方法的代码
//secondary constructor
NIUString::NIUString( const char* other)
{
Capacity = sizeof(other);
Size = strlen(other);
if (Capacity == 0)
{
arrayPoint = nullptr;
}
else
arrayPoint = new char[Capacity];
strcpy(arrayPoint, other);
}
无论如何,我的问题是:这可以做到的方式是什么?我一直在研究这个问题,但是没有找到一个类似于我的任何一个例子。如果有人能指导我正确的方向,那将是非常有用的。
这是我用来测试我的方法/类的代码;其他一切正常,除了数组的容量。
NIUString s2 = "some text";
cout << "s2: " << s2 << endl;
cout << "s2 size: " << s2.size() << endl;
cout << "s2 capacity: " << s2.capacity() << endl;
cout << "s2 is " << ((s2.empty()) ? "empty\n" : "not empty\n");
cout << endl <<endl << endl;
答案 0 :(得分:2)
试试这个,做你想做的事:
1)自动填充容量
2)容量&gt;大小
但是其他参数绝对不能使用new分配:
template <int _size>
NIUString::NIUString( const char (&other)[_size])
{
Capacity = _size;
Size = strlen(other);
if (Capacity == 0)
{
arrayPoint = nullptr;
}
else
{
arrayPoint = new char[Capacity];
strcpy(arrayPoint, other);
}
}
void main()
{
char aux[20];// this works
strcpy(aux, "test");
NIUString niu(aux);
}
答案 1 :(得分:0)
好的,如果你有权访问原始指针变量(必须是静态的),那么sizeof只能起作用。通常你会使用c ++类,而不必考虑它。
我认为他们想要这段代码:
NIUString::NIUString( const char* other)
{
Size = strlen(other);
if (Capacity == 0)
{
arrayPoint = nullptr;
}
if (Capacity <= Size + 1)
{
Capacity = Size + 1;
}
arrayPoint = new char[Capacity];
strcpy(arrayPoint, other);
}
答案 2 :(得分:0)
&#34;将新对象的字符串容量设置为字符串大小。&#34;
这是在
之后完成的&#34;将新对象的字符串大小设置为其他C字符串的长度。&#34;
因此:
字符串大小 = 字符串长度
字符串容量 = 字符串大小
然后:
我认为他们要求这样做:
//secondary constructor
NIUString::NIUString( const char* other)
{
Capacity = Size = strlen(other);
if (Capacity == 0)
{
arrayPoint = nullptr;
}
else
arrayPoint = new char[Capacity];
strcpy(arrayPoint, other);
}
答案 3 :(得分:0)
由于未指定字符数组的终点(动态分配),因此sizeof将无法执行您想要的操作。