相关疑难解决方法(0)

在C++中创建新的异常

我有一个C++类,我试图在Ubuntu中运行它:

#ifndef WRONGPARAMETEREXCEPTION_H_
#define WRONGPARAMETEREXCEPTION_H_

#include <iostream>
#include <exception>
#include <string>

using namespace std;

#pragma once

class WrongParameterException: public exception
{
    public:
        WrongParameterException(char* message): exception(message) {};
        virtual ~WrongParameterException() throw() {};
}; 

#endif
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,编译器给我这个错误:

WrongParameterException.h: In constructor ‘WrongParameterException::WrongParameterException(char*)’:
WrongParameterException.h:14: error: no matching function for call to ‘std::exception::exception(char*&)’
/usr/include/c++/4.3/exception:59: note: candidates are: std::exception::exception()
/usr/include/c++/4.3/exception:57: note: std::exception::exception(const std::exception&)
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我尝试将消息变量更改为stringconst string,const string&但它没有帮助.

以下是我如何使用我从main创建的新异常:

try
{
     if ((strToInt1 == -1) || (parameters[1] == NULL) || (strToInt3 == -1) || …
Run Code Online (Sandbox Code Playgroud)

c++ linux ubuntu exception

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

单个类具有类重新定义错误

我是C++的新手,我在头文件中遇到了类定义问题.头文件(Student.h)的代码是:

#include <string>
using namespace std;

class Student
{
  // Data Members for a Student
  string id;
  string preferences[3];
  int skill;

  // Constructor
 public:
  Student(){}

 public:
  void SetID(string str)
  { this->id = str; }
 public:
  void SetSkill(int i)
  { this->skill = i; }
 public:
  void SetPreferences(int i, string s)
  {
    this->preferences[i] = s;
  }
};

class StudentSchedule
{
 public:
  StudentSchedule(){}
};
Run Code Online (Sandbox Code Playgroud)

编译器错误表示第14行(学生类)是'学生'的重新定义,第15行({ - 类学生后面的开放式大括号)是先前的'学生'定义.StudentSchedule类存在前两个连续行的相同错误.

我的编译中的任何地方都没有定义任何类的.c,.cpp或.h文件.我不知道为什么我会收到这个错误.

c++ class redefinition

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

何时使用包含警卫或#pragma一次C++

它是使用您的任何一种选择好的做法/既包括警卫和#pragma once每一个头文件,或者只是那些东西,例如类的声明?

我很想把它放在每个标题中,但我担心它会不需要,只会增加编译时间.什么是良好做法或共同做什么?

让我澄清一下:我理解两者之间的区别.我问的是,经验丰富的程序员是在每个文件中使用它还是只在需要它的文件中使用它.

c++ pragma include-guards include

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

与朋友功能的前向声明:无效使用不完整类型

#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

尝试编译此代码时,发生了一些错误.例如

无效使用不完整类型

这段代码有什么问题?

c++ forward-declaration friend-function

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

#pragma和#ifndef有什么区别?

可能重复:
#pragma一次vs包括警卫?

我应该什么时候使用#pragma once

我应该什么时候使用#ifndef HEADER_H_INCLUDED

c

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

在C ++中使用#ifndef和#define是否已过时?

我最近开始学习C ++,我问了一个每天在工作中使用C ++的朋友关于#ifndef和#define的知识。他说,没有人使用,因为如果有人编写适当的代码,他们就不必管教。但是,在我读的那些书中(对于初学者而言),被告知使用它们是一种好习惯。

c++ include

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

为什么友元函数不被视为在没有额外声明的情况下声明它的类的名称空间的成员?

假设我们有一个foo来自命名空间的类space,它声明了一个friend名为 的函数bar,该函数稍后定义,如下所示:

namespace space {
    struct foo {
        friend void bar(foo);
    };
}

namespace space {
    void bar(foo f) { std::cout << "friend from a namespace\n"; }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,friend void bar(foo); 声明 bar是一个按值获取space的自由函数foo。要使用它,我们可以简单地执行以下操作:

auto f = space::foo();
bar(f);
Run Code Online (Sandbox Code Playgroud)

我的理解是,我们不必说space::bar,因为 ADL 会看到 的定义与(其参数)bar 相同namespacefoo,并允许我们省略全名限定。尽管如此,我们仍然可以对其进行限定

auto f = space::foo();
space::bar(f);
Run Code Online (Sandbox Code Playgroud)

其工作原理(并且应该工作)完全相同。

当我引入其他文件时,事情开始变得奇怪。假设我们将类和声明移动到foo.hpp

#ifndef PROJECT_FOO_HPP
#define PROJECT_FOO_HPP …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces friend header-files

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

标题用C++保护问题

我是编写自己的标题的新手,但由于必要,我必须学习.

我正在写一个标题,而我正在试图控制标题.在包含的头文件之前和之后有一个或两个下划线之间有区别吗?

拿这个假设的例子:xh

//x.h
#ifndef __X_H_INCLUDED__
#define __X_H_INCLUDED__
//functions n stuff
#endif
Run Code Online (Sandbox Code Playgroud)

与:

//x.h
#ifndef _X_H_INCLUDED_
#define _X_H_INCLUDED_
//functions n stuff
#endif
Run Code Online (Sandbox Code Playgroud)

一个或多或少比另一个好吗?有区别吗?

c++ macros header

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

#pragma once 与包含守卫

我正在经历实现定义的行为控制

并且有以下与 相关的文字#pragma once

与头文件保护不同的是,这个 pragma 使得不可能在多个文件中错误地使用相同的宏名称。

我不确定这意味着什么。有人可以解释一下吗?

TIA

c++ pragma include-guards

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

当我使用这样的头文件时,如何停止#include冗余头?

所以我仍然习惯于模块化编程,并希望确保我坚持最佳实践.如果我有下面的两个模块头文件,是否会#included多次包含每个文件的标题(例如"mpi.h")?有没有正确的方法来解释这个?

此外,我的模块标题通常看起来像这些示例,因此任何其他批评/指针都会有所帮助.

/* foo.h */
#ifndef FOO_H
#define FOO_H

#include <stdlib.h>
#include "mpi.h"

void foo();

#endif
Run Code Online (Sandbox Code Playgroud)

/* bar.h */
#ifndef BAR_H
#define BAR_H

#include <stdlib.h>
#include "mpi.h"

void bar();

#endif
Run Code Online (Sandbox Code Playgroud)

并使用示例程序:

/* ExampleClient.c */
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#include "foo.h"
#include "bar.h"

void main(int argc, char *argv[]) {
    foo();
    MPI_Func();
    bar();
    exit(0)
}
Run Code Online (Sandbox Code Playgroud)

c compiler-construction

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