小编Mik*_*our的帖子

类型字段是纯粹的邪恶吗?

正如在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++ code-organization

4
推荐指数
1
解决办法
927
查看次数

QString和德国变形金刚

我正在使用C++和QT,并且德语变音符号有问题.我有一个像"wirsindmüde"的QString,并希望将其更改为"wir sind mü de",以便在QTextBrowser中正确显示它.

我试着这样做:

s = s.replace( QChar('ü'), QString("&uuml;"));
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

 s = s.replace( QChar('\u00fc'), QString("&uuml;"))
Run Code Online (Sandbox Code Playgroud)

不起作用.

当我循环遍历字符串中的所有字符时,'ü'是两个字符.

有谁能够帮我?

c++ qstring qt

4
推荐指数
1
解决办法
3539
查看次数

返回C++对象 - 最佳实践

我是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++ oop

3
推荐指数
1
解决办法
2241
查看次数

使用 C++ 和 RAII 读取文件

使用 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)

c++ raii

3
推荐指数
1
解决办法
2834
查看次数

我应该在C++中使用什么样的数据结构

我需要一些东西来表示一对序列的序列,如下所示:

[((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++

2
推荐指数
1
解决办法
153
查看次数

在c ++代码中奇怪地使用void

以下是关于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++ std

2
推荐指数
2
解决办法
187
查看次数

为什么现代的C ++库不优先支持线程?

许多第三方C / C ++库提供多线程支持线程的优先级,相应的调度程序等。为什么现代C ++标准不支持此有用功能?

c++ concurrency multithreading c++11

2
推荐指数
2
解决办法
828
查看次数

O(n ^ 2)vs O(n)中的算法

我是计算机科学的新手,只是从伪代码开始的,所以我有一些疑问。这是我本学期的第三周,大部分时间都是自学的。我有一些问题:

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#算法中,它看起来如何?

c# c++ algorithm pseudocode

2
推荐指数
2
解决办法
1万
查看次数

STL迭代器进入构造函数

我想知道如何编写一个接受任何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对于如何将其概括为接受任何输入迭代器并没有真正意义上的
任何帮助吗?

谢谢!

c++ constructor iterator stl

1
推荐指数
1
解决办法
2085
查看次数

使用十六进制值对 std::string 进行编码

我的应用程序需要在 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++

1
推荐指数
1
解决办法
2076
查看次数