小编Ali*_*232的帖子

在类内部或外部重载运算符有什么区别?

在C++中,我知道有两种方法可以重载.我们可以在内部(如类a)或外部(如类b)重载它.但是,问题是,这两者在编译时或运行时是否存在差异?

class a
{
public:
    int x;
    a operator+(a p) // operator is overloaded inside class
    {
        a temp;
        temp.x = x;
        temp.x = p.x;
        return temp;
    }
};

class b
{
public:
    friend b operator+(b, b);
    int x;
};

b operator+(b p1, b p2) // operator is overloaded outside class
{
    p1.x += p2.x;
    return p1;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

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

C++ 11 lambda返回lambda

这段代码并不是JS开发人员所不知道的

function get_counter()
{
    return (
        function() {
            var c = 0;
            return function() { return ++c; };
        })();
}
Run Code Online (Sandbox Code Playgroud)

它基本上创建了一个创建不同的枚举器.所以我想知道在使用新的lambda语义的C++ 11中是否可以做同样的事情?我最终写了这篇C++,遗憾的是它不能编译!

int main()
{
    int c;
    auto a = [](){
        int c = 0;
        return [&](){
            cout << c++;
        };
    };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有一个解决方法来编译它,如果有编译器如何使这个代码正确运行?我的意思是它必须创建单独的枚举器,但它也应该收集垃圾(未使用的c变量).

顺便说一句,我正在使用VS2012编译器,它会生成此错误:

Error   2   error C2440: 'return' : cannot convert from 'main::<lambda_10d109c73135f5c106ecbfa8ff6f4b6b>::()::<lambda_019decbc8d6cd29488ffec96883efe2a>' to 'void (__cdecl *)(void)'    c:\users\ali\documents\visual studio 2012\projects\test\test\main.cpp   25  1   Test
Run Code Online (Sandbox Code Playgroud)

c++ lambda visual-c++ c++11 visual-studio-2012

22
推荐指数
3
解决办法
8431
查看次数

使用三元运算符初始化引用变量?

抛开所有可维护性和读取问题,这些代码行是否会产生不确定的行为?

float  a = 0, b = 0;
float& x = some_condition()? a : b;
x = 5;
cout << a << ", " << b;
Run Code Online (Sandbox Code Playgroud)

c++ reference ternary-operator

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

Qt Creator编译错误":: swprintf和:: vswprintf尚未声明"

到目前为止,我已经在visual studio中编写了所有代码,现在我需要添加一些UI,因此我将使用Qt.所以我在我的项目中添加了每个文件(主类除外),然后尝试使用Qt编译它.因为我使用了一些c ++ 0x功能,所以我必须将这一行添加到项目文件中:

QMAKE_CXXFLAGS += -std=c++0x
Run Code Online (Sandbox Code Playgroud)

然后我尝试编译它.只有两个错误(可能会有更多但是这两个编译器停止)

In file included from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/postypes.h:42,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:42,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,

                 from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:40,

                 from ../TranslatorBase/ttObject.h:5,

                 from ../TranslatorBase/ttArray.h:5,

                 from ../TranslatorBase/ttArray.cpp:1:

d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf' has not been declared

d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprintf' has not been declared
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会出现这样的错误.并确保我首先尝试使用此命令使用cygwin/gcc编译同一项目:

gcc -std=c++0x TranslatorBase/ttArray.cpp -c -o ttArray.o
Run Code Online (Sandbox Code Playgroud)

即使没有任何警告,它也没有错误编译.事实上,我项目中的每个文件都在没有任何警告的情况下进行编译.

我现在正在使用基于Qt v4.7.0的Qt Creator v2.0.1并使用mingw/gcc v4.4.0

- 编辑 -

只是我发现的一件新事物,即使没有我的源文件(只有Qt生成的文件),仍然存在编译错误.我觉得gcc有问题.

@Troubadour Qt生成了这个命令:

g++ -c -std=c++0x -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I'd:/Qt/qt/include/QtCore' -I'd:/Qt/qt/include/QtGui' -I'd:/Qt/qt/include' -I'd:/Qt/qt/include/ActiveQt' -I'debug' -I'.' -I'../TranslatorUI' …
Run Code Online (Sandbox Code Playgroud)

c++ qt gcc mingw c++11

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

全局变量何时分配内存?

一段时间以来一直困扰着我,但我没有找到关于此事的任何好资源.我的代码中有一些全局变量.很明显,它们是按照某种顺序初始化的,但是在进行任何初始化之前保留所有这些对象所需的内存是什么?

这是我的代码中可能出错的简单示例以及如何使用答案:

我有一个map<RTTI, object*> objectPool在我的代码中保存每个类的样本,我用它来加载文件中的对象.为了创建这些示例,我使用一些全局变量来将类实例引入objectPool.但有时这些示例实例是在ObjectPool本身之前初始化的.这会产生运行时错误.

为了解决这个错误我使用了一些延迟初始化程序map<RTTI,object*>* lateInitializedObjectPool;.现在每个实例首先检查objectPool是否已初始化,如果没有则初始化它,然后将其自身引入对象池.它似乎工作正常,但我担心,即使对象池指针所需的内存在其他类开始自我介绍之前没有保留,这可能会导致访问冲突.

c++ global-variables

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

寻找具有O(1)索引和O(log(n))插入和删除的数据容器

我不确定它是否可能,但对我来说似乎有点合理,我正在寻找一种允许我进行这些操作的数据结构:

  • 插入带O的项目(log n)
  • 删除带有O的项目(log n)
  • 查找/编辑O(1)中的第k个最小元素,用于任意k(O(1)索引)

当然,编辑不会导致元素顺序的任何变化.什么使它成为可能的是我将按递增的顺序逐个插入元素.因此,如果我第五次尝试插入,我确定在这之前的所有四个元素都比它小,并且在此之后的所有元素将会更大.

algorithm containers data-structures

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

模板c ++的模板?

我已经设法创建了一些preperty类,其中包含了我们期望的所有内容.我的意思是在使用它时你不需要调用函数只是使用operator =will会做所有的工作.但是只有一件事我想如果我们能解决它会很好:

template <class T, class X,void (T::*setFunc)(const X&),const X& (T::*getFunc)()const> class property
{ 
    T* const owner;
    X data;
    friend T;
    property(T*const  pOwner) : owner (pOwner)
    {
    }
public:
    property& operator = (const X& input){(owner->*setFunc)(input);return *this;}
    operator const X&()const {return (owner->*getFunc)();}
};

struct c
{
protected:
    void setInt(const int& data);
    const int& getInt() const;
public:
    c();
    property<c, int ,&setInt,&getInt> myInt;
};

c::c() : myInt(this)
{
}

void c::setInt(const int& data)
{
    myInt.data = data;
}
const int& c::getInt() …
Run Code Online (Sandbox Code Playgroud)

c++ templates properties

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

模板类限制

我想知道是否有任何方法限制为我的情况下使用自定义条件生成模板的代码我想要只在模板类T由类栏继承时调用foo(类似这样)

template <class T:public bar> void foo()
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

从 html 表创建一个 json 数组

我有 C++ 程序将日志文件导出为 HTML 表,我想知道是否有任何方法可以解析该表(类似这样):

<table>
<tr><td>id</td><td>value1</td><td>value2</td></tr>
<tr><td>0 </td><td>0     </td><td>0     </td></tr>
<tr><td>0 </td><td>1.5   </td><td>2.15  </td></tr>
</table>
Run Code Online (Sandbox Code Playgroud)

使用 Javascript 函数转换为 JSON 数组(类似这样):

 var chartData = [
            {id:"0",value1:"0",value2:"0"},
            {id:"1",value1:"1.5",value2:"2.15"}];
Run Code Online (Sandbox Code Playgroud)

问题是我希望这个函数适用于给它的每个表,任何可能的行或列数(第一行总是一个标题)。

javascript json

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

反正有没有从他们的vtable重建一些保存的类?

我正在将一些对象复制到一个文件中,并且它们都是从同一个类中删除的.但我希望能够在加载它们之后调用它们的函数来执行该类应该执行的操作,这是我迄今为止所做的:

#include <iostream>
#include <fstream>

using namespace std;

struct a
{
    virtual void print()
    {
        cout << "this is a.\n";
    };
};

struct b : public a
{
    virtual void print()
    {
        cout << "this is b.\n";
    }
};

int main()
{
    ofstream testofile("test.bin",ios::binary);
    a* tempa = new a;
    a* tempb = new b;
    testofile.write((char*)tempa,sizeof(a));
    testofile.write((char*)tempb,sizeof(b));
    testofile.flush();
    testofile.close();
    ifstream testifile("test.bin",ios::binary);
    a* x = (a*)new char[max(sizeof(a),sizeof(b))];
    testifile.read((char*)x,sizeof(a));
    x->print();
    testifile.read((char*)x,sizeof(b));
    x->print();
}
Run Code Online (Sandbox Code Playgroud)

我的例子工作正常,但如果我评论保存部分然后运行该程序似乎vtable对新的已修改的应用程序无效(虽然我的代码中的任何内容都没有更改).问题是我的文件管理器类不知道可能从我的基础对象中解脱的所有可能的对象,我想只使用一次调用文件管理器来重建我的所有应用程序结构来加载它.当然,我的每个对象都有自己的保存/加载功能,但是filemanager应该如何猜测适合当前数据块的加载函数在哪里?

c++ polymorphism vtable

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