Переход с C # на C ++, хорошие ссылки? - PullRequest
4 голосов
/ 15 декабря 2009

Я только что закончил свой второй класс ООП, и мои первые и вторые классы преподавались на C #, но для остальных моих классов программирования мы будем работать на C ++. В частности, мы будем использовать визуальный компилятор C ++. Проблема в том, что мы сами должны изучать основы C ++, без перехода от нашего профессора. Итак, мне было интересно, знает ли кто-нибудь из вас о хороших ресурсах, на которые я мог бы пойти, чтобы узнать о C ++, происходящих из фона на c #?

Я спрашиваю об этом, потому что я заметил много различий между C # и C ++, таких как объявление вашего main метода int и возвращение 0, и что ваш основной метод не всегда содержится в классе. Кроме того, я заметил, что все ваши классы должны быть написаны до вашего основного метода, я слышал, что это потому, что VC ++ соответствует сверху вниз?

В любом случае, вы знаете несколько хороших ссылок?

Спасибо! (Кроме того, есть ли где-нибудь, где я могу сравнить простые программы, которые я написал на C #, чтобы увидеть, как они будут выглядеть в C ++, например ту, которую я написал ниже)?

using System;
using System.IO;
using System.Text; // for stringbuilder

class Driver
{
const int ARRAY_SIZE = 10;

static void Main()
{
    PrintStudentHeader(); // displays my student information header

    Console.WriteLine("FluffShuffle Electronics Payroll Calculator\n");
    Console.WriteLine("Please enter the path to the file, either relative to your current location, or the whole file path\n");

    int i = 0;

    Console.Write("Please enter the path to the file: ");
    string filePath = Console.ReadLine();

    StreamReader employeeDataReader = new StreamReader(filePath);

    Employee[] employeeInfo = new Employee[ARRAY_SIZE];

    Employee worker;

    while ((worker = Employee.ReadFromFile(employeeDataReader)) != null)
    {
        employeeInfo[i] = worker;
        i++;
    }

    for (int j = 0; j < i; j++)
    {
        employeeInfo[j].Print(j);
    }

    Console.ReadLine();

}//End Main()


class Employee
{
const int TIME_AND_A_HALF_MARKER = 40;
const double FEDERAL_INCOME_TAX_PERCENTAGE = .20;
const double STATE_INCOME_TAX_PERCENTAGE = .075;
const double TIME_AND_A_HALF_PREMIUM = 0.5;

private int employeeNumber;
private string employeeName;
private string employeeStreetAddress;
private double employeeHourlyWage;
private int employeeHoursWorked;
private double federalTaxDeduction;
private double stateTaxDeduction;
private double grossPay;
private double netPay;

// -------------- Constructors ----------------

public Employee() : this(0, "", "", 0.0, 0) { }

public Employee(int a, string b, string c, double d, int e)
{
    employeeNumber = a;
    employeeName = b;
    employeeStreetAddress = c;
    employeeHourlyWage = d;
    employeeHoursWorked = e;
    grossPay = employeeHourlyWage * employeeHoursWorked;

    if (employeeHoursWorked > TIME_AND_A_HALF_MARKER)
        grossPay += (((employeeHoursWorked - TIME_AND_A_HALF_MARKER) * employeeHourlyWage) * TIME_AND_A_HALF_PREMIUM);

    stateTaxDeduction = grossPay * STATE_INCOME_TAX_PERCENTAGE;
    federalTaxDeduction = grossPay * FEDERAL_INCOME_TAX_PERCENTAGE;
}

// --------------- Setters -----------------

/// <summary>
/// The SetEmployeeNumber method
/// sets the employee number to the given integer param
/// </summary>
/// <param name="n">an integer</param>
public void SetEmployeeNumber(int n)
{
    employeeNumber = n;
}

/// <summary>
/// The SetEmployeeName method
/// sets the employee name to the given string param
/// </summary>
/// <param name="s">a string</param>
public void SetEmployeeName(string s)
{
    employeeName = s;
}

/// <summary>
/// The SetEmployeeStreetAddress method
/// sets the employee street address to the given param string
/// </summary>
/// <param name="s">a string</param>
public void SetEmployeeStreetAddress(string s)
{
    employeeStreetAddress = s;
}

/// <summary>
/// The SetEmployeeHourlyWage method
/// sets the employee hourly wage to the given double param
/// </summary>
/// <param name="d">a double value</param>
public void SetEmployeeHourlyWage(double d)
{
    employeeHourlyWage = d;
}

/// <summary>
/// The SetEmployeeHoursWorked method
/// sets the employee hours worked to a given int param
/// </summary>
/// <param name="n">an integer</param>
public void SetEmployeeHoursWorked(int n)
{
    employeeHoursWorked = n;
}

// -------------- Getters --------------

/// <summary>
/// The GetEmployeeNumber method
/// gets the employee number of the currnt employee object
/// </summary>
/// <returns>the int value, employeeNumber</returns>
public int GetEmployeeNumber()
{
    return employeeNumber;
}

/// <summary>
/// The GetEmployeeName method
/// gets the name of the current employee object
/// </summary>
/// <returns>the string, employeeName</returns>
public string GetEmployeeName()
{
    return employeeName;
}

/// <summary>
/// The GetEmployeeStreetAddress method
/// gets the street address of the current employee object
/// </summary>
/// <returns>employeeStreetAddress, a string</returns>
public string GetEmployeeStreetAddress()
{
    return employeeStreetAddress;
}

/// <summary>
/// The GetEmployeeHourlyWage method
/// gets the value of the hourly wage for the current employee object
/// </summary>
/// <returns>employeeHourlyWage, a double</returns>
public double GetEmployeeHourlyWage()
{
    return employeeHourlyWage;
}

/// <summary>
/// The GetEmployeeHoursWorked method
/// gets the hours worked for the week of the current employee object
/// </summary>
/// <returns>employeeHoursWorked, as an int</returns>
public int GetEmployeeHoursWorked()
{
    return employeeHoursWorked;
}

// End --- Getter/Setter methods

/// <summary>
/// The CalcSalary method
/// calculates the net pay of the current employee object
/// </summary>
/// <returns>netPay, a double</returns>
private double CalcSalary()
{
    netPay = grossPay - stateTaxDeduction - federalTaxDeduction;

    return netPay;
}

/// <summary>
/// The ReadFromFile method
/// reads in the data from a file using a given a streamreader object
/// </summary>
/// <param name="r">a streamreader object</param>
/// <returns>an Employee object</returns>
public static Employee ReadFromFile(StreamReader r)
{
    string line = r.ReadLine();

    if (line == null)
        return null;

    int empNumber = int.Parse(line);
    string empName = r.ReadLine();
    string empAddress = r.ReadLine();
    string[] splitWageHour = r.ReadLine().Split();
    double empWage = double.Parse(splitWageHour[0]);
    int empHours = int.Parse(splitWageHour[1]);

    return new Employee(empNumber, empName, empAddress, empWage, empHours);
}

/// <summary>
/// The Print method
/// prints out all of the information for the current employee object, uses string formatting
/// </summary>
/// <param name="checkNum">The number of the FluffShuffle check</param>
public void Print(int checkNum)
{
    string formatStr = "| {0,-45}|";

    Console.WriteLine("\n\n+----------------------------------------------+");
    Console.WriteLine(formatStr, "FluffShuffle Electronics");
    Console.WriteLine(formatStr, string.Format("Check Number: 231{0}", checkNum));
    Console.WriteLine(formatStr, string.Format("Pay To The Order Of:  {0}", employeeName));
    Console.WriteLine(formatStr, employeeStreetAddress);
    Console.WriteLine(formatStr, string.Format("In The Amount of {0:c2}", CalcSalary()));
    Console.WriteLine("+----------------------------------------------+");
    Console.Write(this.ToString());
    Console.WriteLine("+----------------------------------------------+");
}

/// <summary>
/// The ToString method
/// is an override of the ToString method, it builds a string
/// using string formatting, and returns the built string. It particularly builds a string containing
/// all of the info for the pay stub of a sample employee check
/// </summary>
/// <returns>A string</returns>
public override string ToString()
{
    StringBuilder printer = new StringBuilder();

    string formatStr = "| {0,-45}|\n";

    printer.AppendFormat(formatStr,string.Format("Employee Number:  {0}", employeeNumber));
    printer.AppendFormat(formatStr,string.Format("Address:  {0}", employeeStreetAddress));
    printer.AppendFormat(formatStr,string.Format("Hours Worked:  {0}", employeeHoursWorked));
    printer.AppendFormat(formatStr,string.Format("Gross Pay:  {0:c2}", grossPay));
    printer.AppendFormat(formatStr,string.Format("Federal Tax Deduction:  {0:c2}", federalTaxDeduction));
    printer.AppendFormat(formatStr,string.Format("State Tax Deduction:  {0:c2}", stateTaxDeduction));
    printer.AppendFormat(formatStr,string.Format("Net Pay:    {0:c2}", CalcSalary()));

    return printer.ToString();

}
}

Ответы [ 6 ]

7 голосов
/ 15 декабря 2009

C ++ и C # - это разные языки с разной семантикой и правилами. Не существует сложного и быстрого способа переключения с одного на другой. Вам придется выучить C ++.

Для этого некоторые из ресурсов для изучения вопросов C ++ могут дать вам интересные советы. Найдите также книги C ++ - см., Например, окончательный справочник книг C ++ и список .

В любом случае вам понадобится много времени для изучения C ++. Если ваш учитель ожидает, что вы просто знаете C ++ совершенно неожиданно, у вашей школы есть серьезная проблема.

6 голосов
/ 15 декабря 2009

Мой совет такой:

Не думайте о C ++ в терминах C #. Начните с нуля и попробуйте выучить C ++ из хорошего, твердого учебника по C ++.

Попытка отобразить C ++ в образ мышления C # не сделает вас хорошим разработчиком C ++ - это действительно совсем другое дело. Очень сложно портировать с C # на C ++ (не на C ++ / CLI, а на прямой C ++), потому что большая часть C # действительно является платформой .NET, которая не будет доступна при работе в C ++.

Кроме того, есть очень, очень много вещей, которые выполняются в C ++ иначе, чем в C #. Хотя шаблоны C # выглядят как шаблоны C ++, они сильно отличаются друг от друга, и это изменение становится все более распространенным при работе в C ++.

Ваш опыт облегчит многие вещи, но действительно лучше думать о нем, как о том, что это - совершенно другой язык.

1 голос
/ 15 декабря 2009

Многие колледжи и университеты преподают C # / Java до или даже вместо C ++. Они делают это потому, что есть убеждение, что вы будете изучать объектно-ориентированную разработку более корректно на языке, который не позволяет вам использовать не-ОО подходы, которые все еще возможны в C ++.

Вы должны просто спросить своего профессора, так ли это.

Если это так, вы должны обнаружить, что он / она будет вводить специфику C ++ аккуратно и только в случае необходимости. Цель состоит в том, чтобы вы смогли применить многие из передовых методов, которые вы изучили в C #, к своему коду C ++. Вы также более четко увидите, где C ++ позволяет вам нарушать некоторые правила ОО и, что еще более важно, где это может быть даже полезно.

В качестве альтернативы, если вы обнаружите, что ваш профессор прыгает прямо в указатели C ++ и управление памятью без какого-либо руководства, тогда (как сказал кто-то другой) курс выглядит не очень хорошо спланированным. В этом случае вам может понадобиться получить копию языка программирования C ++ от Stroustrup.

1 голос
/ 15 декабря 2009

На самом деле не существует места для сравнения, о котором я знаю для проверки вашего кода на его реализацию в C ++. Вместо этого я бы порекомендовал вам найти местного эксперта по разработке ОО и попросить его или ее провести тщательный анализ кода вашего примера кода. После этого он или она могли бы, вероятно, пойти с вами через порт на C ++, и вы увидите, что языки не сильно отличаются. (В библиотеках вы найдете значимые различия, а не языки; но на данном этапе это может не относиться к вам.)

Проверка кода отличается от того, чтобы попросить вашего профессора или ТА оценить вашу работу. Профессор, скорее всего, не успеет сделать полный обзор с вами (хотя он или она может пройти несколько пунктов в своем кабинете.) Хороший рецензент кода проведет вас через код построчно, предоставив отзыв и такие вопросы, как «как вы думаете, почему я это сделаю или не буду делать?», «вы подумали, что произойдет, если ваши требования изменятся на X?», или «что произойдет с этим кодом, если кто-то еще захочет использовать повторно». Y?» По мере того, как вы будете проходить обзор, они помогут укрепить хорошие принципы ОО. Вы узнаете много нового от того, кто это сделал. (Найти хорошего человека может быть трудной задачей - получить направление, если это возможно, или попросить кого-то, кто знаком с рефакторингом. Возможно, попросите TA или аспиранта сделать это.) С вашим кодом выше, я бы ожидал это займет час или два.

Вы также можете попросить жителей StackOverflow сделать проверку кода с вами по электронной почте или прямо здесь, в комментариях / ответах. Я уверен, что вы получите красочные ответы, и обсуждение, скорее всего, будет образовательным.

Также полезно сделать обзор кода кода опытного человека - задать вопросы о том, «почему вы это сделали?» может привести к пониманию; и всегда очень весело, когда новичок находит ошибку в коде гуру.

После того, как вы пройдете обзор с экспертом, чтобы увидеть, на что они похожи (хотя бы один или два отзыва), подумайте о проведении проверок кода со своими сверстниками в классе, где каждый из вас просматривает код другой. Даже неопытный глаз может задать вопрос, который вызывает более глубокое понимание.

Я понимаю, что вы должны рассмотреть классную работу по C ++, но вам также нужно больше практиковаться с основами проектирования ОО. Как только вы приобретете больше практического опыта, вы обнаружите, что все языки на основе Си - это всего лишь синтаксические вариации общего набора идей - хотя некоторые языковые функции облегчат вашу работу, другие усложнят ее.

0 голосов
/ 07 января 2010

Книга для вашей конкретной ситуации: Pro Visual C ++ 2005 для разработчиков C #

alt text

(также MSDN отмечает некоторые различия между ними.)

0 голосов
/ 07 января 2010

Важно помнить, что в C # при передаче объекта вы фактически передаете ссылку на этот объект.

C #: void EnrollStudent( Student s ) s - это ссылка (местоположение в памяти) на фактический объект.

C ++: void EnrollStudent( Student s ) s фактический объект. Какой бы большой ни был объект, именно столько места вы будете занимать в стеке.

Эквивалент C ++ для метода C # void EnrollStudent( Student* s )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...