QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1935|回复: 20

喜爱编程的同学请进,挑战自己的C++水平!

[复制链接]
发表于 2005-4-1 16:55:06 | 显示全部楼层 |阅读模式
原题如下:

#include <stdio.h>

int main()

{

  MyType<int> s1(10),s2(-5),s3;

  MyType<double> s4(10.3),s5(5.2),s6;

  s3=s1+s2;

  s6=s4-s5;

  printf("s1.value=%d s2.value=%d s3.value=%d\n",s1.getValue(),s2.getValue(),s3.getValue());

  printf("s4.value=%2.1f s5.value=%2.1f s6.value=%2.1f\n",s4.getValue(),s5.getValue(),s6.getValue());

  return 0;

}

要求:用C++语言定义MyType(包括结构体),使之能通过上面的测试程序。测试程序的输出应该为:

s1.value=10 s2.value=-5 s3.value=5

s4.value=10.3 s5.value=5.2 s6.value=5.1

大家可以先试一下,很简单!好,让我们提高一下难度!

我们改一下题,请看下题:

#include <iostream.h>


int main()

{

  MyType<int> s1(10),s2(-5),s3;

  MyType<double> s4(10.3),s5(5.2),s6;

  s3=s1+s2;

  s6=s4-s5;

  cout<<"s1.value="<<s1<<" s2.value="<<s2<<" s3.value="<<s3<<endl;

  cout<<"s4.value="<<s4<<" s5.value="<<s5<<" s6.value="<<s6<<endl;

  return 0;

}

要求:

1.用C++语言定义MyType(包括结构体),使之能通过上面的测试程序。测试程序的输出应该为:


s1.value=10 s2.value=-5 s3.value=5


s4.value=10.3 s5.value=5.2 s6.value=5.1

2.为充分体现封装性,不允许出现像上题中出现的getValue()这种暴露内部私有数据的函数;

3.MyType必须定义和实现在MyType.h和MyType.cpp文件中。

请做出来的同学把完整的MyType.h,MyType.cpp和main.cpp文件贴出来,并注明您使用的编译器及版本号。

做完这个小程序,我想大家至少会对C++多有以下的理解,假若你以前不知道的话:

1.对分离式编译的理解。

2.对模板类‘+’‘-’运算符重载的理解(如果你是用重载成员函数的方式,It's Too easy!没意思!我指的是用友元函数来实现:)

3.强制大家重载<<运算符就为了让使用友元函数,应该能体会如何在模板类中使用模板函数。
发表于 2005-4-1 17:25:56 | 显示全部楼层
又是老师给出的题吧,强烈逼视这样的同学,不好好学习,还这样嚣张!
回复

使用道具 举报

 楼主| 发表于 2005-4-1 19:24:15 | 显示全部楼层
嘿嘿,第一个是老师出的,第二个为了提高难度,我改了改,说我不好好学我也没办法了,汗ing...........

原贴见
http://bbs.xdnice.com/dispbbs.asp?boardid=66&id=67542

谢谢!
回复

使用道具 举报

发表于 2005-4-3 08:21:54 | 显示全部楼层
没有难度的无聊作业。。。
出题的时候找点动脑子的东西好不好?
回复

使用道具 举报

 楼主| 发表于 2005-4-5 11:38:05 | 显示全部楼层
没办法,西电 计算机软件专业 研究生的面向对象课程 也只不过出这种难度的题,我们LINUX公社的同志就是强!
回复

使用道具 举报

发表于 2005-4-5 15:41:14 | 显示全部楼层

我写的。

mytype.h文件:
[code:1]#ifndef MYTYPE_H
#define MYTYPE_H

#include <iostream>

template <typename T>
class MyType
{
    template <typename U>   
    friend class MyType;

    private:
        T value;
   
    public:
        MyType();
        MyType(T v);
        MyType(const MyType<T>& v);

        void operator = (const MyType<T>& v);
       
    friend MyType<T> operator + (const MyType<T>& a, const MyType<T>& b)
    {
        return a.value + b.value;
    }
   
    friend MyType<T> operator - (const MyType<T>& a, const MyType<T>& b)
    {
        return a.value - b.value;
    }
   
    friend std::ostream& operator << (std::ostream& os, const MyType<T>& a)
    {
        return std::cout << a.value;       
    }
};

#include "mytype.cpp"

#endif[/code:1]
///////////////////////////////////////////////////////////////////////////////
mytype.cpp文件:
[code:1]#include <iostream>

#include "mytype.h"

template <typename T>
MyType<T>::MyType ()
{
   
}
template <typename T>
MyType<T>::MyType (T v) : value(v)
{
   
}
template <typename T>
MyType<T>::MyType (const MyType<T>& v) : value(v.value)
{
   
}

template <typename T>
void MyType<T>::operator = (const MyType<T>& v)
{
    value = v.value;
}
[/code:1]
////////////////////////////////////////////////////////////////////////////////
main.cpp文件:
[code:1]#include <iostream>
#include "mytype.h"
using namespace std;
int main()
{
    MyType<int> s1(10),s2(-5),s3;

    MyType<double> s4(10.3),s5(5.2),s6;

    s3=s1+s2;
    s6=s4-s5;

    cout<<"s1.value="<<s1<<" s2.value="<<s2<<" s3.value="<<s3<<endl;
    cout<<"s4.value="<<s4<<" s5.value="<<s5<<" s6.value="<<s6<<endl;

    return 0;
}[/code:1]

////////////////////////////////////////////////////////////////////////////////////
编译器:mingw
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\xian>g++ -v
Reading specs from D:/App/MinGW/bin/../lib/gcc-lib/mingw32/3.2.3/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=c++,f77,objc --disable-win32-registry --disable-shared --enable-sjlj-
exceptions
Thread model: win32
gcc version 3.2.3 (mingw special 20030504-1)
回复

使用道具 举报

发表于 2005-4-5 23:15:47 | 显示全部楼层
[code:1]$ g++ *.cpp
mytype.cpp:7: error: redefinition of `MyType<T>::MyType()'
mytype.cpp:7: error: `MyType<T>::MyType()' previously declared here
mytype.cpp:11: error: redefinition of `MyType<T>::MyType(T)'
mytype.cpp:11: error: `MyType<T>::MyType(T)' previously declared here
mytype.cpp:16: error: redefinition of `MyType<T>::MyType(const MyType<T>&)'
mytype.cpp:16: error: `MyType<T>::MyType(const MyType<T>&)' previously declared here
mytype.cpp:23: error: redefinition of `void MyType<T>::operator=(const MyType<T>&)'
mytype.cpp:23: error: `void MyType<T>::operator=(const MyType<T>&)' previously declared here[/code:1]

This is what I got while compiling the code from bros tuantuan.
[code:1]$ g++ --version
g++ (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[/code:1]

As per http://www.network-theory.co.uk/docs/gccintro/gccintro_53.html, neither the "export" keyword nor seperating template interface with implementation is supported in GCC 3 series, so the question has NO answer.
回复

使用道具 举报

发表于 2005-4-6 09:04:04 | 显示全部楼层
在MyType.h内我已用#include "mytype.ccp"包含了实现文件,所以编译时只需要用下面的命令就可以了:
linux:
     g++ -Wall main.cpp -o main

windiow:
     g++ -Wall main.cpp -o main.exe
回复

使用道具 举报

发表于 2005-4-6 17:23:27 | 显示全部楼层
昏倒。。。#include <mytype.cpp> 这种事情。。。
回复

使用道具 举报

发表于 2005-4-6 22:33:15 | 显示全部楼层

包含实现文件只是解决以上问题的一种方法

包含实现文件只是解决以上问题的一种方法,在《C++Templates》还提到了其它的方法。只我觉得这是最简单的一种,所以就用了。
回复

使用道具 举报

发表于 2005-4-7 11:27:52 | 显示全部楼层
虽然简单,但是根本是错误的。
export 关键字就是用于模板分离编译的,但是目前主流编译器都不支持。
回复

使用道具 举报

发表于 2005-4-7 13:50:09 | 显示全部楼层
错不错,那就要看你怎么用了。
回复

使用道具 举报

发表于 2005-4-7 16:33:10 | 显示全部楼层
哈哈,well it's true anyway, but meaningless. There's no rule forbiding you from using "goto" in your code, too. You'll just get mad when things get more complexity.

It's off topic and I will just stop here.
回复

使用道具 举报

 楼主| 发表于 2005-4-8 22:59:55 | 显示全部楼层
呵呵,在MyType.h中include MyType.cpp还不如在main.cpp中include MyType.cpp来的直接,在头文件中的函数代码会被认为是内联,而在cpp文件中则不会。另外在.h文件中包含cpp文件是不是有点。。。
回复

使用道具 举报

发表于 2005-4-9 08:50:36 | 显示全部楼层
对于楼上所说的“在头文件中的函数代码会被认为是内联,而在cpp文件中则不会”,我并不曾听说过。我只知道当一个类的成员函数不单独声明而是直接将定义写在类定义中,编译器会按照内联处理。

楼主,你的答案呢?
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-6 07:09 , Processed in 0.066206 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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