正如在12.2.5节中的c ++编程语言第3版中所讨论的那样,类型字段倾向于创建比使用虚函数和多态的等效代码更不通用,容易出错,更不直观和更少可维护的代码.
举个简短的例子,下面是如何使用类型字段:
void print(const Shape &s)
{
switch(s.type)
{
case Shape::TRIANGE:
cout << "Triangle" << endl;
case Shape::SQUARE:
cout << "Square" << endl;
default:
cout << "None" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
很明显,这是一个噩梦,因为为此增加了一种新的形状,十几种类似的功能会容易出错并且很费劲.
尽管存在这些缺点以及TC++ PL中描述的那些缺点,但是有没有这样的实例(使用类型字段)比使用虚函数的语言特性更好的解决方案?或者这种做法应该被列为纯粹的邪恶?
现实的例子比人为的例子更受欢迎,但我仍然对人为的例子感兴趣.另外,你有没有在生产代码中看到这一点(即使虚拟功能会更容易)?
我正在使用C++和QT,并且德语变音符号有问题.我有一个像"wirsindmüde"的QString,并希望将其更改为"wir sind mü de",以便在QTextBrowser中正确显示它.
我试着这样做:
s = s.replace( QChar('ü'), QString("ü"));
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
也
s = s.replace( QChar('\u00fc'), QString("ü"))
Run Code Online (Sandbox Code Playgroud)
不起作用.
当我循环遍历字符串中的所有字符时,'ü'是两个字符.
有谁能够帮我?
我是C++的新手,我遇到了以下问题:
想象一下,您有一个创建新对象并返回此对象的函数.这样做的最佳方法是什么?我找到了3种不同的解决方案.
解决方案1使用复制构造函数
MyClass getMyClass() {
MyClass obj;
//work with obj, set values...
return obj;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,你创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象.所以我创建了两个对象,但我只需要一个.是对的吗?
解决方案2在堆上创建对象并使用指针
MyClass* getMyClass() {
MyClass* obj = new MyClass();
//work with obj, set values...
return obj;
}
Run Code Online (Sandbox Code Playgroud)
这似乎是最糟糕的解决方案,您必须自己进行内存管理.
解决方案3将对象作为参数传递
MyClass getMyClass(MyClass& obj) {
//work with obj, set values...
return obj;
}
Run Code Online (Sandbox Code Playgroud)
您可以创建默认对象并在函数中设置所有值.
我也很想使用unique_ptr<MyCLass>
但是存在同样的问题,即在unique_ptr
保留功能范围时会被破坏.
使用 C++ 和 RAII 读取文件的最佳方法是什么?我见过的所有示例都使用类似于以下代码的内容:
#include <iostream>
#include <fstream>
int main () {
std::ifstream is ("test.txt", std::ifstream::binary);
if (is) {
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);
char * buffer = new char [length]; // Seems wrong?
is.read (buffer, length);
delete[] buffer;
}
}
Run Code Online (Sandbox Code Playgroud)
根据我对 RAII 的了解,初始化 char 指针并手动删除它似乎是错误的。
我做过类似的事情:
#include <iostream>
#include <fstream>
int main () {
std::ifstream is ("test.txt", std::ifstream::binary);
if (is) {
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);
std::shared_ptr<char> buffer …
Run Code Online (Sandbox Code Playgroud) 我需要一些东西来表示一对序列的序列,如下所示:
[((1,2) (1,3)) ((1,2) (1,4) (1,5))].
我还需要自由地附加对的序列来制作一对对的序列,像这样append.[((1 2)(3 4)) ((5 6))] = ((1 2)(3 4)(5 6)).
在C++中有什么简单易用的东西可以让我像这样操作我的数据吗?
以下是关于C++中异步任务的演示文稿中的一些代码
template <class T> class Future<T>{
//something
void foo(std::function<void(T)> cb);
//something
};
Run Code Online (Sandbox Code Playgroud)
什么void(T)
意思?
许多第三方C / C ++库提供多线程支持线程的优先级,相应的调度程序等。为什么现代C ++标准不支持此有用功能?
我是计算机科学的新手,只是从伪代码开始的,所以我有一些疑问。这是我本学期的第三周,大部分时间都是自学的。我有一些问题:
O(n ^ 2)与O(n)算法有什么区别?-同样,O(n log n)是什么?-和?(n ^ 2)?
到目前为止,我已经写了:
horner = 0;
for( i = n; i >= 0; i ?? )
horner = x * horner + a[i];
Run Code Online (Sandbox Code Playgroud)
但是发现它是O(n)。如何转换?
运行时间是多少?-我知道第一行的分配是1个操作
在实际的C#算法中,它看起来如何?
我想知道如何编写一个接受任何STL输入迭代器的自定义类(在本例中是一个链表)的构造函数.我已经创建了一个与我的List类绑定的自定义Iterator类.
这很好用.
template <typename T>
List<T>::List(Iterator beg, Iterator end) : first_(0) {
while (beg != end)
insertLast(*beg++);
}
Run Code Online (Sandbox Code Playgroud)
我已经设法创建一个接收这样的列表迭代器的构造函数.
List<T>::List(typename list<T>::iterator s, typename list<T>::iterator e) :
first_(0) {
while (s != e)
insertLast(*s++);
Run Code Online (Sandbox Code Playgroud)
我的STL-fu对于如何将其概括为接受任何输入迭代器并没有真正意义上的
任何帮助吗?
谢谢!
我的应用程序需要在 std::string 中编码和传输一些十六进制值。所以我就这样做。
static string printHex(const string& str)
{
stringstream ss;
ss << "[ " << hex;
for (int i = 0; i < str.size(); i++)
{
ss << (((uint32_t)str[i] )& 0xFF) << " ";
}
ss << "]" << dec;
return ss.str();
}
int main()
{
char ptr[] = {0xff, 0x00, 0x4d, 0xff, 0xdd};// <--see here, 0x00 is the issue.
string str(ptr);
cout << printHex(str) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显然,该字符串仅获取 0x00 以内的值,其余数据都会丢失。如果没有 0x00,它将适用于任何值。但我也需要 0x00。请提出一个解决方案。谢谢您的帮助。
c++ ×10
algorithm ×1
c# ×1
c++11 ×1
concurrency ×1
constructor ×1
iterator ×1
oop ×1
pseudocode ×1
qstring ×1
qt ×1
raii ×1
std ×1
stl ×1