鱼C论坛

 找回密码
 立即注册
查看: 2405|回复: 9

[已解决]为什么老是报错?

[复制链接]
发表于 2022-12-19 14:38:49 | 显示全部楼层 |阅读模式
10鱼币

DLL源代码(HomeWork.cpp, 自己写的):
  1. #include <iostream>
  2. using namespace std;

  3. #define DLLEXPORT __declspec(dllexport)

  4. extern "C" class DLLEXPORT Lovers {
  5.         public:
  6.                 Lovers(string name);
  7.                 void kiss(Lovers *lover);
  8.                 void ask(Lovers *lover, string something);

  9.         protected:
  10.                 string name;

  11.         friend class Others;
  12. };

  13. extern "C" class DLLEXPORT BoyFriend : public Lovers {
  14.         public:
  15.                 BoyFriend(string name);
  16. };

  17. extern "C" class DLLEXPORT GirlFriend : public Lovers {
  18.         public:
  19.                 GirlFriend(string name);
  20. };

  21. extern "C" class DLLEXPORT Others {
  22.         public:
  23.                 Others(string name);
  24.                 void kiss(Lovers * lover);

  25.         protected:
  26.                 string name;
  27. };

  28. extern "C" DLLEXPORT Lovers::Lovers(string name) {
  29.         this->name = name;
  30. }

  31. extern "C" void DLLEXPORT Lovers::kiss(Lovers * lover) {
  32.         cout << name << "亲亲我们家的" << lover->name << endl;
  33. }

  34. extern "C" void DLLEXPORT Lovers::ask(Lovers * lover, string something) {
  35.         cout << "宝贝儿" << lover->name << "帮我" << something << endl;
  36. }

  37. extern "C" DLLEXPORT BoyFriend::BoyFriend(string name) : Lovers(name) {
  38. }

  39. extern "C" DLLEXPORT GirlFriend::GirlFriend(string name) : Lovers(name) {
  40. }

  41. extern "C" DLLEXPORT Others::Others(string name) {
  42.         this->name = name;
  43. }
复制代码

编译命令:cl HomeWork.cpp /LD
(CL编译器,Version19.34.31937 x64 Microsoft优化版)


主程序代码(main.cpp):
  1. #include <iostream>
  2. using namespace std;

  3. extern class Lovers;
  4. extern class BoyFriend;
  5. extern class GirlFriend;
  6. extern class Others;

  7. int main(void) {
  8.         string boyName, girlName;

  9.         cout << "请输入新郎姓名:";
  10.         cin >> boyName;
  11.         cout << "请输入新娘姓名:";
  12.         cin >> girlName;

  13.         BoyFriend boyFriend(boyName);
  14.         GirlFriend girlFriend(girlName);
  15.         Others others("路人甲");

  16.         girlFriend.kiss(&boyFriend);
  17.         boyFriend.kiss(&girlFriend);
  18.         girlFriend.ask(&boyFriend, "洗衣服啦");

  19.         cout << endl << "当当当当!传说中的路人甲登场!" << endl;
  20.         others.kiss(&girlFriend);

  21.         return 0;
  22. }
复制代码


编译命令:cl main.cpp /link HomeWork.lib
(CL编译器,Version 19.34.31937 x64 Microsoft优化版)

错误信息:
  1. 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.34.31937 版
  2. 版权所有(C) Microsoft Corporation。保留所有权利。

  3. main.cpp
  4. main.cpp(4): warning C4091: “extern ”: 没有声明变量时忽略“Lovers”的左侧
  5. main.cpp(5): warning C4091: “extern ”: 没有声明变量时忽略“BoyFriend”的左侧
  6. main.cpp(6): warning C4091: “extern ”: 没有声明变量时忽略“GirlFriend”的左侧
  7. main.cpp(7): warning C4091: “extern ”: 没有声明变量时忽略“Others”的左侧
  8. main.cpp(17): error C2079: “boyFriend”使用未定义的 class“BoyFriend”
  9. main.cpp(17): error C2440: “初始化”: 无法从“std::string”转换为“int”
  10. main.cpp(17): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
  11. main.cpp(18): error C2079: “girlFriend”使用未定义的 class“GirlFriend”
  12. main.cpp(18): error C2440: “初始化”: 无法从“std::string”转换为“int”
  13. main.cpp(18): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
  14. main.cpp(19): error C2079: “others”使用未定义的 class“Others”
  15. main.cpp(19): error C2440: “初始化”: 无法从“const char [7]”转换为“int”
  16. main.cpp(19): note: 没有使该转换得以执行的上下文
复制代码


求助!!!



最佳答案
2022-12-19 14:38:50
两个问题:
1. extern 只能是函数或变量,不能是类,我觉得你应该把 homework.cpp 做成头文件,也就是 hpp,当然这没什么必要,都是一样的效果
main 中就 include 一下 homework.cpp,记得要用 ""

所以,homework.cpp 内容:
  1. #include <iostream>
  2. using namespace std;

  3. #define DLLEXPORT __declspec(dllexport)

  4. extern "C" class DLLEXPORT Lovers {
  5.         public:
  6.                 Lovers(string name);
  7.                 void kiss(Lovers *lover);
  8.                 void ask(Lovers *lover, string something);

  9.         protected:
  10.                 string name;

  11.         friend class Others;
  12. };

  13. extern "C" class DLLEXPORT BoyFriend : public Lovers {
  14.         public:
  15.                 BoyFriend(string name);
  16. };

  17. extern "C" class DLLEXPORT GirlFriend : public Lovers {
  18.         public:
  19.                 GirlFriend(string name);
  20. };

  21. extern "C" class DLLEXPORT Others {
  22.         public:
  23.                 Others(string name);
  24.                 void kiss(Lovers * lover);

  25.         protected:
  26.                 string name;
  27. };

  28. extern "C" DLLEXPORT Lovers::Lovers(string name) {
  29.         this->name = name;
  30. }

  31. extern "C" void DLLEXPORT Lovers::kiss(Lovers * lover) {
  32.         cout << name << "亲亲我们家的" << lover->name << endl;
  33. }

  34. extern "C" void DLLEXPORT Lovers::ask(Lovers * lover, string something) {
  35.         cout << "宝贝儿" << lover->name << "帮我" << something << endl;
  36. }

  37. extern "C" DLLEXPORT BoyFriend::BoyFriend(string name) : Lovers(name) {
  38. }

  39. extern "C" DLLEXPORT GirlFriend::GirlFriend(string name) : Lovers(name) {
  40. }

  41. extern "C" DLLEXPORT Others::Others(string name) {
  42.         this->name = name;
  43. }
复制代码

main.cpp 内容:
  1. #include "homework.cpp"

  2. int main(void) {
  3.         string boyName, girlName;

  4.         cout << "请输入新郎姓名:";
  5.         cin >> boyName;
  6.         cout << "请输入新娘姓名:";
  7.         cin >> girlName;

  8.         BoyFriend boyFriend(boyName);
  9.         GirlFriend girlFriend(girlName);
  10.         Others others("路人甲");

  11.         girlFriend.kiss(&boyFriend);
  12.         boyFriend.kiss(&girlFriend);
  13.         girlFriend.ask(&boyFriend, "洗衣服啦");

  14.         cout << endl << "当当当当!传说中的路人甲登场!" << endl;
  15.         others.kiss(&girlFriend);

  16.         return 0;
  17. }
复制代码

要注意,homework 已经导入了 iostream,已经 using 了 std,所以 main.cpp 再导入 iostream 没有必要

2. Other::kiss 仅声明了但没有定义

文件.zip

155.67 KB, 阅读权限: 10, 下载次数: 3

文件

最佳答案

查看完整内容

两个问题: 1. extern 只能是函数或变量,不能是类,我觉得你应该把 homework.cpp 做成头文件,也就是 hpp,当然这没什么必要,都是一样的效果 main 中就 include 一下 homework.cpp,记得要用 "" 所以,homework.cpp 内容: main.cpp 内容: 要注意,homework 已经导入了 iostream,已经 using 了 std,所以 main.cpp 再导入 iostream 没有必要 2. Other::kiss 仅声明了但没有定义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-19 14:38:50 | 显示全部楼层    本楼为最佳答案   
两个问题:
1. extern 只能是函数或变量,不能是类,我觉得你应该把 homework.cpp 做成头文件,也就是 hpp,当然这没什么必要,都是一样的效果
main 中就 include 一下 homework.cpp,记得要用 ""

所以,homework.cpp 内容:
  1. #include <iostream>
  2. using namespace std;

  3. #define DLLEXPORT __declspec(dllexport)

  4. extern "C" class DLLEXPORT Lovers {
  5.         public:
  6.                 Lovers(string name);
  7.                 void kiss(Lovers *lover);
  8.                 void ask(Lovers *lover, string something);

  9.         protected:
  10.                 string name;

  11.         friend class Others;
  12. };

  13. extern "C" class DLLEXPORT BoyFriend : public Lovers {
  14.         public:
  15.                 BoyFriend(string name);
  16. };

  17. extern "C" class DLLEXPORT GirlFriend : public Lovers {
  18.         public:
  19.                 GirlFriend(string name);
  20. };

  21. extern "C" class DLLEXPORT Others {
  22.         public:
  23.                 Others(string name);
  24.                 void kiss(Lovers * lover);

  25.         protected:
  26.                 string name;
  27. };

  28. extern "C" DLLEXPORT Lovers::Lovers(string name) {
  29.         this->name = name;
  30. }

  31. extern "C" void DLLEXPORT Lovers::kiss(Lovers * lover) {
  32.         cout << name << "亲亲我们家的" << lover->name << endl;
  33. }

  34. extern "C" void DLLEXPORT Lovers::ask(Lovers * lover, string something) {
  35.         cout << "宝贝儿" << lover->name << "帮我" << something << endl;
  36. }

  37. extern "C" DLLEXPORT BoyFriend::BoyFriend(string name) : Lovers(name) {
  38. }

  39. extern "C" DLLEXPORT GirlFriend::GirlFriend(string name) : Lovers(name) {
  40. }

  41. extern "C" DLLEXPORT Others::Others(string name) {
  42.         this->name = name;
  43. }
复制代码

main.cpp 内容:
  1. #include "homework.cpp"

  2. int main(void) {
  3.         string boyName, girlName;

  4.         cout << "请输入新郎姓名:";
  5.         cin >> boyName;
  6.         cout << "请输入新娘姓名:";
  7.         cin >> girlName;

  8.         BoyFriend boyFriend(boyName);
  9.         GirlFriend girlFriend(girlName);
  10.         Others others("路人甲");

  11.         girlFriend.kiss(&boyFriend);
  12.         boyFriend.kiss(&girlFriend);
  13.         girlFriend.ask(&boyFriend, "洗衣服啦");

  14.         cout << endl << "当当当当!传说中的路人甲登场!" << endl;
  15.         others.kiss(&girlFriend);

  16.         return 0;
  17. }
复制代码

要注意,homework 已经导入了 iostream,已经 using 了 std,所以 main.cpp 再导入 iostream 没有必要

2. Other::kiss 仅声明了但没有定义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-19 14:40:18 | 显示全部楼层
在线等急!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-20 08:05:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-20 08:10:13 | 显示全部楼层
好,我来研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-20 10:11:06 | 显示全部楼层
能不能说明一下这是在做什么?
出现错误的原因在于编译器在编译 main.cpp 的时候对于另一个 cpp 文件中的内容,具体的,这些自定义的类的信息,包括它们的成员变量、方法等,一无所知,它只能假设它们的构造函数接受 int 型变量作为参数,因此提示无法从 std::string 转换到 int 。
需要让编译器知道这些类型的具体信息。可能将类的声明放在头文件中供两个 cpp 文件引用,将类方法等的实现放在 HomeWork.cpp 中,将 HomeWork.cpp 编译为库并将其链接到主程序上会是比较常见的方案。
5楼的方法应该能够工作,但多少有点邪道的意味在里面
另外,就像5楼提到的, Other::kiss 没有实现,因此即使正确组织应该也无法工作。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-21 08:58:24 | 显示全部楼层
dolly_yos2 发表于 2022-12-20 10:11
能不能说明一下这是在做什么?
出现错误的原因在于编译器在编译 main.cpp 的时候对于另一个 cpp 文件中的 ...

哪里邪道了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-21 10:44:01 | 显示全部楼层

这么做和把所有内容写到一个文件里没有区别,既然如此何必拆分成不同的文件呢?
这种方式,如果不小心进行的话,还可能带来各种问题,比如符号的多重定义。逻辑上这种拆分文件的组织方式是尤其为了服务大规模的代码的,但随意 include 源文件会抵消甚至逆转其带来的好处
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-21 10:45:14 | 显示全部楼层
dolly_yos2 发表于 2022-12-21 10:44
这么做和把所有内容写到一个文件里没有区别,既然如此何必拆分成不同的文件呢?
这种方式,如果不小心进 ...

有道理,学会了,感谢大佬提醒
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-21 10:46:08 | 显示全部楼层
你的头像,不拿CCF一等奖???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 22:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表