相关疑难解决方法(0)

何时使用内联功能何时不使用?

我知道inline是对编译器的提示或请求,用于避免函数调用开销.

那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?

c c++ inline

173
推荐指数
5
解决办法
9万
查看次数

C++中的toString覆盖

在Java中,当一个类重写.toString()并且你这样做System.out.println()时会使用它.

class MyObj {
    public String toString() { return "Hi"; }
}
...
x = new MyObj();
System.out.println(x); // prints Hi
Run Code Online (Sandbox Code Playgroud)

如何在C++中实现这一点,以便:

Object x = new Object();
std::cout << *x << endl;
Run Code Online (Sandbox Code Playgroud)

会输出一些我选择的有意义的字符串表示Object吗?

c++ tostring

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

我应该在哪里实现我的类方法?

我知道我的类方法有三种不同类型的实现"位置":

1)在我的类(.h文件)中定义方法并在我的.cpp文件中实现它

//.h
class Foo
{
  int getVal() const;
};


//.cpp
int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)

2)在我的类(.h文件)中定义并实现该方法.

//.h
class Foo
{
  int getVal() const
  { return 0; }
};
Run Code Online (Sandbox Code Playgroud)

3)在我的类中定义方法并在类外但在我的头文件中实现它.

//.h
class Foo
{
  int getVal() const;
};

int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)

这三种方法有哪些主要区别?

c++

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

内联限定符源于原型或定义?

我对标准中的这一点不太确定.说我有三个这样的文件:

foo.h中

#include <iostream>

inline void foo();

void foo()
{
   std::cout << "Foo" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中:

#include "foo.h"

void baz();

int main()
{
   baz();
   foo();
}
Run Code Online (Sandbox Code Playgroud)

bar.cpp

#include "foo.h"

void baz()
{
   foo();
}
Run Code Online (Sandbox Code Playgroud)

现在,foo的定义将被编译为编译单元foo.o和bar.o. 如果我理解正确,内联函数将避免链接器冲突.G ++编译和链接这很好,但使用clang ++ 2.8我得到这个错误:

/tmp/cc-7RdmYP.o: In function `foo()':
bar.cpp:(.text+0x50): multiple definition of `foo()'
/tmp/cc-LW3id3.o:foo.cpp:(.text+0x50): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

看来clang ++并不是void foo()一个内联函数.但是,当我向定义添加内联时,它确实正常工作.

我是否必须在void foo()此处添加内联以将其视为内联函数,或者这是一个clang ++错误?

c++ gcc clang

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

一个定义规则 - 内联函数的多个定义

我正在阅读ODR,正如规则所说"In the entire program, an object or non-inline function cannot have more than one definition",我尝试了以下内容......

file1.cpp

#include <iostream>
using namespace std;

inline int func1(void){ return 5; }
inline int func2(void){ return 6; }
inline int func3(void){ return 7; }
int sum(void);

int main(int argc, char *argv[])
{
    cout << func1() << endl;
    cout << func2() << endl;
    cout << func3() << endl;
    cout << sum() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

file2.cpp

inline int func1(void) { return 5; } …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

GCC 可以内联静态库中的函数吗?

我正在制作一个库,该库将从内联其函数中受益匪浅,但它相当大,我决定将其编译为静态库,而不仅仅是预编译头。在使用该库的代码中,如何使 GCC 从静态库内联代码(粘贴调用代码而不是链接和调用它)(这是否可能)?

c++ gcc

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

C++中的内联函数

Hii,

我是C++的新手.我确实阅读过有关内联函数的内容并正确理解它们.但是这个站点说"如果我们在一个.cpp文件中写入内联函数的定义并从另一个文件调用它,我们得到一个'未解决的外部'错误....为什么会这样......?这可以做到正常功能正确...如果我错了请纠正我...

谢谢

c++

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

c ++没有cpp文件的静态类变量

我有一个简单的类来存储传感器数据,可以概括为

class Data
{
  public:
  Data(){timestamp = Time::now(); id = sNextID++; data = 0; type = DATA_TYPE_UNKNOWN;}

  double data;
  Time timestamp;
  DataType type;

  private:
  static unsigned int sNextID;
};
Run Code Online (Sandbox Code Playgroud)

我有一个头文件,声明了一堆类似的数据类.鉴于类的简单性,不需要实现cpp文件.

问题是,如果没有实现文件,我该如何初始化sNextID?我在某个地方看到它默认为0这样会好的,虽然依赖它似乎有点hackish.但更重要的是,如果没有在某个地方初始化它,链接器就会抱怨未定义的引用.

c++ static-members

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

运算符过载的未解析外部符号

我已经定义了以下函数chess_location.h:

inline chess_location operator+(chess_location lhs, const chess_coord& rhs);
Run Code Online (Sandbox Code Playgroud)

然后,在chess_location.cpp:

#include "chess_location.h"

chess_location operator+(chess_location lhs, const chess_coord& rhs) { 
  //function definition
}
Run Code Online (Sandbox Code Playgroud)

然后在我的main()in中使用此运算符main.cpp,如下所示:

#include "chess_location.h"
int main() {
  chess_location_B = chess_location_A + chess_coord;
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到链接器错误,说无法找到运算符:

error LNK2019: unresolved external symbol "class chess_location __cdecl operator+(class chess_location,class chess_coord const &)" (??H@YA?AVchess_location@@V0@ABVchess_coord@@@Z) referenced in function _main
Run Code Online (Sandbox Code Playgroud)

在我看来,链接器并没有将运算符的声明连接到定义,但我不确定为什么.我怀疑我的身体可能有问题const.main.cpp但是,如果我将运算符定义移动到,则所有内容都会编译并正常工作.

知道这个错误来自何处?

c++ linker operator-overloading

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

内联公共接口的方法

通常我更喜欢完全拆分声明和定义,因此,我倾向于定义内联方法,.cpp
我只是希望链接优化器在不同的编译单元中使用它时将其内联。

我的问题是:

  1. 如果我知道我的链接器在链接时支持内联,真的不鼓励在 cpp 中内联吗?
  2. 如果我想从另一个库调用该函数应该怎么做?(它会起作用吗?)

c++ linker compilation inline

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

为什么我不能在课堂上内联函数?

我正在通过编写公共数据结构来学习c ++,并且我有一个编译器警告我没有定义我的内联添加方法.

src/vector.h:10:14: warning: inline function 'Vector::add' is not defined
      [-Wundefined-inline]
        inline void add(const float val);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?据我所知,方法匹配.但是,如果我删除内联方法,它工作正常,但第一次调用add需要11380us,但第二次和第三次是3667us左右 - 大约4倍的罚款成本.

SRC/vector.h

//#include <cstddef>

class Vector {
public:
    explicit Vector(const int n);
    explicit Vector(const int n, const float val);
    float& operator[](const int i);
    inline int const length();
    inline void fill(const float val);
    inline void add(const float val);
    inline float sum();
private:
    float* arr;
    int len;
};
Run Code Online (Sandbox Code Playgroud)

src.vector.cpp

#include "vector.h"
#include <iostream>
#include <algorithm>
#include "yepCore.h"
#include "yepMath.h"
#include "yepLibrary.h"
#include <cstdlib>

using …
Run Code Online (Sandbox Code Playgroud)

c++ inline c++11

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

C++头文件/实现文件和重载操作符

我经常使用C++并且遇到一个让我失望的简单错误.

在Xcode中,我有以下两个错误:在Event.h中:Control reaches end of non-void function 在Event.cpp中:Overloaded operator must have at least one argument of class or enumeration

这两个错误都在方法签名的行上

bool operator () (Event *left, Event *right)
Run Code Online (Sandbox Code Playgroud)

这里是完整的.h和.cpp文件(还没有那么多):Event.h

#ifndef __EventSimulation__EventComparison__
#define __EventSimulation__EventComparison__

#include <iostream>
#include "Event.h"
class EventComparison {
public:
    bool operator () (Event *left, Event *right){}

};
#endif
Run Code Online (Sandbox Code Playgroud)

Event.cpp

#include "EventComparison.h"
#include "Event.h"

bool operator() (Event *left, Event *right) {
    return left->time > right->time;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我修复这个错误并解释什么/为什么发出编译错误以及如何在功能中避免这种情况.谢谢你的帮助!

c++ operator-overloading header-files

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