gpt4 book ai didi

c++ - 将接口(interface)和实现与普通功能分离

转载 作者:行者123 更新时间:2023-11-28 08:29:43 25 4
gpt4 key购买 nike

这看起来应该很简单,我可能漏掉了一些简单的东西。

这是我要运行的代码。它是 3 个文件,2*cpp 和 1*header。

这不会在代码块上运行,我想看看我遗漏了什么!

这些是给出的错误:

obj\Debug\main.o||在函数`main'中:|

|9|对`generateArray(int*, int)'的 undefined reference |

|11|对`reverseOrder(int*, int*, int)'的 undefined reference |

|13|对“displayArray(int*, int*, int)”的 undefined reference |

// lab6.h
#ifndef LAB6_H_INCLUDED
#define LAB6_H_INCLUDED

int const arraySize = 10;
int array1[arraySize];
int array2[arraySize];

void generateArray(int[], int );
void displayArray(int[], int[], int );
void reverseOrder(int [],int [], int);

#endif // LAB6_H_INCLUDED

// lab6.cpp

#include "lab6.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using std::cout; using std::endl;
using std::rand; using std::srand;
using std::time;
using std::setw;

void generateArray(int array1[], int arraySize)
{
srand(time(0));
for (int i=0; i<10; i++)
{
array1[i]=(rand()%10);
}
}

void displayArray(int array1[], int array2[], int arraySize)
{
cout<<endl<<"Array 1"<<endl;
for (int i=0; i<arraySize; i++)
{
cout<<array1[i]<<", ";
}
cout<<endl<<"Array 2"<<endl;
for (int i=0; i<arraySize; i++)
{
cout<<array2[i]<<", ";
}
}

void reverseOrder(int array1[],int array2[], int arraySize)
{
for (int i=0, j=arraySize-1; i<arraySize;j--, i++)
{
array2[j] = array1[i];
}
}

// and finally main.cpp
#include "lab6.h"

int main()
{
generateArray(array1, arraySize);
reverseOrder(array1, array2, arraySize);
displayArray(array1, array2, arraySize);
return 0;
}

最佳答案

根据链接器的错误消息,您似乎没有给链接器两个对象文件,它找不到您在lab6 中定义的内容.cpp。我不知道 CodeBlocks,所以我不知道您必须如何设置项目才能使链接器传递所有目标文件。
然而,大多数编译器会使用它们生成的所有目标文件调用链接器,因此手动调用编译器

cc lab6.cpp main.cpp

(将您的编译器替换为“cc”)可能会。

无论如何,一旦你做到了这一点,你仍然会遇到链接器错误,因为你的数组是在 header 中定义的,这使得它们结束分为两个翻译单元。然后链接器会提示重复符号

除此之外,我会批评

  • 你使用全局变量而不是局部变量(一旦你解决了这个问题,它们也不再在两个翻译单元中定义),
  • 如果您更改 arraySize(因为您还没有在所有地方使用它),代码会崩溃,
  • 您使用 int 来指定数组的大小,而不是 std::size_t
  • 你使用 C 数组而不是 C++ 容器(这可能是必需的,因为这是家庭作业)。

哦,我会在需要时删除所有使用 std:: 的 using 声明和前缀标识符。在您的情况下,它甚至可以节省打字时间。此外,它使代码更清晰(有些人会反对这一点)并且它更少 error prone (很难反驳)。

关于c++ - 将接口(interface)和实现与普通功能分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com