相关疑难解决方法(0)

如何将std :: string传递给glShaderSource?

我有以下代码:

glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)

但这会让我的程序崩溃.我怎么转换std::stringconst char **?我也试过, (const char **)&但它说"需要l值",我不明白.我使用这段代码时工作正常:

const char *data = "some code";
glShaderSource(shader, 1, &data, NULL);
Run Code Online (Sandbox Code Playgroud)

但我不能直接从一个工作std::string.我可以char为它分配一个新数组,但这不是很好的代码.

我也尝试过,const GLchar但显然它没有任何区别.

c++ opengl string char

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

为什么在函数内局部初始化外部变量会产生错误?

这段代码很好编译:

extern int i = 10;

void test()
{
    std::cout << "Hi" << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

虽然这个错误:

void test()
{
    extern int i = 10;
    std::cout << "Hi" << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

错误:'我'有'extern'和初始化程序

我读了C++ Primer

包含显式初始值设定项的任何声明都是定义.我们可以在定义为extern的变量上提供初始化器,但这样做会覆盖extern.具有初始化程序的extern是一个定义.在函数内部的extern上提供初始化程序是错误的.

有人可以解释为什么如果在函数本地完成这应该是一个错误,而在全局范围内允许这样做?

c++ declaration definition extern

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

在C++中定义静态成员

我试图定义一个这样的公共静态变量:

public :
         static int j=0;        //or any other value too
Run Code Online (Sandbox Code Playgroud)

我在这一行得到了一个编译错误:ISO C++禁止非const静态成员`j'的类内初始化.

  1. 为什么在C++中不允许这样做?

  2. 为什么允许const成员初始化?

  3. 这是否意味着C++中的静态变量没有像C一样用0初始化?

谢谢 !

c++ static

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

如何在C99多文件项目中声明内联函数?

我想在项目中定义一个内联函数,用c99编译.我该怎么做?当我在头文件中声明该函数并在.c文件中提供详细信息时,其他文件无法识别该定义.当我将显式函数放在头文件中时,我遇到了一个问题,因为使用它的所有.o文件都有定义的副本,因此链接器给我一个"多重定义"错误.

我想要做的是:

header.h
inline void func()
{
    do things...
}


lib1.c
#include "header.h"
...

lib2.c
#include "header.h"
Run Code Online (Sandbox Code Playgroud)

使用lib1.o和lib2.o的实用程序

c linker c99 inline-functions

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

int x; int y; int*ptr; 是不是初始化,对吧?

我正在阅读JP Mueller和J. Cogswell撰写的"C++ All-in-One for Dummies"并偶然发现:

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...
Run Code Online (Sandbox Code Playgroud)

这段代码首先初始化所有涉及的东西 - 两个整数和一个指向整数的指针.

只是为了确认,这是一个错误,应该读作'......通过声明',对吧?对我来说,这样的基本错误仍然会出现在书中,这一点很奇怪.

c++ terminology initialization declaration language-lawyer

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

'friend'函数和<<运算符重载:为类重载运算符的正确方法是什么?

在我正在进行的项目中,我有一个Score类,定义如下score.h.我试图超载它,因此,当对其<<执行操作时,_points + " " + _name打印.

这是我试图做的事情:

ostream & Score::operator<< (ostream & os, Score right)
{
    os << right.getPoints() << " " << right.scoreGetName();
    return os;
}
Run Code Online (Sandbox Code Playgroud)

以下是返回的错误:

score.h(30) : error C2804: binary 'operator <<' has too many parameters
Run Code Online (Sandbox Code Playgroud)

(此错误实际出现4次)

我设法通过将重载声明为友元函数来使其工作:

friend ostream & operator<< (ostream & os, Score right);
Run Code Online (Sandbox Code Playgroud)

Score::从score.cpp中删除函数声明(实际上没有将其声明为成员).

为什么这样做,但前一段代码没有?

谢谢你的时间!

编辑

我删除了头文件上的重载的所有提及...但我得到以下(和唯一)错误.binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or …

c++ class operator-overloading friend friend-class

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

对运算符new的未定义引用

我正在尝试使用cpputest构建一个简单的单元测试可执行文件.我已将cpputest框架构建到静态库中,现在正尝试将其链接到可执行文件中.但是,由于相关代码,我陷入了相当复杂的Makefile设置.

这是我的命令行:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 
Run Code Online (Sandbox Code Playgroud)

我收到很多错误,如下所示:

 Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
   Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚造成这种情况的原因.我不是用C++免费获得operator new吗?

c++ linker gcc

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

模板编译

我有可能是一个愚蠢的问题,但我只是不理解我的书对它的解释.

它说"当编译器看到模板的定义时,它不会生成代码.它只在我们实例化模板的特定实例时生成代码.事实上代码只在我们使用模板时生成(而不是在我们使用模板时生成定义它)影响我们组织源代码的方式以及何时检测到错误...要生成实例化,编译器需要具有定义函数模板或类模板成员函数的代码.因此,与非模板代码不同,模板的标题通常包括定义和声明."

"生成代码"究竟是什么意思?我想我从来没有真正考虑过编译器发生了什么,并且对它没有太多了解,所以当你编译模板函数或类与非模板函数或类相比时,我不理解它们有什么不同

c++

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

为什么在Effective C++中以这种方式定义声明和定义?

有效的C++(第3版),第2项(身高const,enuminline#define),为类特定常量代码段读:

class GamePlayer {
private:
    static const int NumTurns = 5;    // constant declaration
    int scores[NumTurns];             // use of constant
    ...
};
Run Code Online (Sandbox Code Playgroud)

然后,本书(用我自己的话说)static const int NumTurns = 5;不是一个定义,这通常是C++对类成员所要求的,除非它是一个从不使用地址的静态整数常量.如果上面的常量不是真的,或者编译器因任何原因坚持定义,那么定义应该在实现文件中提供如下:

const int GamePlayer::NumTurns;    // definition of NumTurns; see
                                   // below for why no value is given
Run Code Online (Sandbox Code Playgroud)

根据这本书(也用我自己的话说),定义中没有给出任何价值,因为它已在声明中给出.

这让我认为我已经知道的声明和定义的定义令人困惑(我在问这个问题之前在Google上仔细检查过):

  • 为什么static const int NumTurns = 5不是定义?是NumTurns不是初始化为5这里的值,是不是当声明和定义一起出现时,它被称为初始化?
  • 为什么static积分常数不需要定义?
  • 为什么第二个代码片段在没有定义值时被认为是一个定义,但是包含该值的类中的声明仍然不是一个(基本上回到我的第一个问题)?
  • 是不是初始化定义?为什么这里没有违反"唯一定义"规则?

有可能我现在只是在这里混淆自己,所以有人可以从头开始重新教育我:为什么这两行代码声明和定义而不是另一行,那里有任何初始化实例吗?初始化也是定义吗?

信用:代码片段直接从本书中引用.

编辑:附加参考定义和声明之间的区别是什么? …

c++ effective-c++

21
推荐指数
3
解决办法
1114
查看次数

将类声明放在.cpp文件中

是否可以在同一.cpp文件中进行类声明和实现?

我想借助mock对象做一些单元测试.以下是我测试的一些示例:

// Some includes removed

#include "abstractconnection.h"

class ConnectionMockup : public AbstractConnection
{
    Q_OBJECT
public:
    explicit ConnectionMockup(QObject *parent = 0);

    bool isReady() const;
    void sendMessage(const QString &message);

    void test_send_message(const QString &message);

    bool ready;
    QStringList messages;
};

ConnectionMockup::ConnectionMockup(QObject *parent)
    : AbstractConnection(parent)
{
    ready = true;
}

bool ConnectionMockup::isReady() const
{
    return ready;
}

void ConnectionMockup::sendMessage(const QString &message)
{
    messages.append(message);
}

void ConnectionMockup::test_send_message(const QString &message)
{
    emit messageRecieved(message);
}

TestEmcProgram::TestEmcProgram(QObject *parent) :
    QObject(parent)
{
}

void TestEmcProgram::open()
{
    ConnectionMockup mockup;
    EmcProgram …
Run Code Online (Sandbox Code Playgroud)

c++ qt unit-testing

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